我有一個函式來評估單場剪刀石頭布游戲的結果,并像這樣回傳玩家的名字:
data Symbol = Rock | Paper | Scissors deriving (Eq, Show)
data Outcome = P1 | P2 | Draw deriving (Eq, Show)
evalTurn :: Symbol -> Symbol -> Outcome
evalTurn Rock Scissors = P1
evalTurn Rock Paper = P2
evalTurn Rock Rock = Draw
evalTurn Paper Rock = P1
evalTurn Paper Scissors = P2
evalTurn Paper Paper = Draw
evalTurn Scissors Paper = P1
evalTurn Scissors Rock = P2
evalTurn Scissors Scissors = Draw
type PlayerName = String
data Hand = H PlayerName Symbol deriving (Show)
evalHand :: Hand -> Hand -> Maybe PlayerName
evalHand (H x y) (H a b)
| evalTurn y b == P1 = Just x
| evalTurn y b == P2 = Just a
| evalTurn y b == Draw = Nothing
上述evalHand函式適用于一個游戲,但我的目標是撰寫一個evalMatch能夠接受如下輸入的函式:
evalMatch [ (H "A" Paper, H "B" Rock )
, (H "A" Rock , H "B" Paper)
, (H "A" Rock , H "B" Rock )]
并在串列中回傳結果。:
== [ Just "A", Just "B",Nothing]
到目前為止,這是我所擁有的,但我對地圖功能的使用似乎已關閉。如果有人能指導我朝著正確的方向前進,我將不勝感激。
evalMatch :: [(Hand, Hand)] -> [Maybe PlayerName]
evalMatch [(H x y, H a b)]
| evalTurn y b == P1 = [Just x]
| evalTurn y b == P2 = [Just a]
| evalTurn y b == Draw = [Nothing]
evalMatch ((H x y, H a b):xs) = map evalMatch [x:xs]
uj5u.com熱心網友回復:
你已經有了一個函式evalHand :: Hand -> Hand -> Maybe PlayerName。可以利用uncurry :: (a -> b -> c) -> (a, b) -> c將帶有兩個引數evalHand的函式,這里轉換為一個帶有2元組的函式,并通過呼叫帶有2元組的兩項的函式來回傳結果。
因此,您可以實作一個evalMatch:
evalMatch :: [(Hand, Hand)] -> [Maybe PlayerName]
evalMatch = map (…)
我把填寫…部分作為練習。此運算式應與uncurry和 一起使用evalHand。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370709.html
標籤:哈斯克尔
