我正在尋找一種如何使用一種型別串列的內容的方法,以輸出另一種型別的串列以在游戲中使用。
data Dir = N | E | S | W deriving (Show,Eq)
data Steps = Forward | Right | Back | Left deriving Show
quickGame :: Dir -> [Dir] -> [Steps]
quickGame d [] = []
所以如果quickGame N [S,W,E,N,N]是輸入,我會收到回報 [Back,Right,Back,Left,Forward]。
任何幫助,將不勝感激。我已經嘗試了 if then else 來遍歷串列以輸出第二個,但必須有更干凈的方法嗎?
uj5u.com熱心網友回復:
首先,您將遇到與型別的內置Left和Right建構式沖突Either,因此讓我們重新定義:
data Step = F | R | B | L deriving Show
然后,讓我們定義一個助手,將我們當前的方向與新的方向進行比較,并回傳一個適當的步驟。這很乏味,但相對簡單。
step :: Dir -> Dir -> Step
step N N = F
step N E = R
step N S = B
step N W = L
step E N = L
step E E = F
step E S = R
step E W = B
step S N = B
step S E = L
step S S = F
step S W = R
step W N = R
step W E = B
step W S = L
step W W = F
現在,quickGame可以通過將當前方向(第一個引數)與下一個方向(第二個引數的第一個元素)進行比較并輸出適當的步驟來遞回表示,然后quickGame以新方向作為“當前”遞回呼叫:
quickGame :: Dir -> [Dir] -> [Steps]
quickGame cur (nxt:rest) = step cur nxt : quickGame nxt rest
quickGame _ [] = []
最終代碼:
data Dir = N | E | S | W deriving Show
data Step = F | R | B | L deriving Show
quickGame :: Dir -> [Dir] -> [Step]
quickGame cur (nxt:rest) = step cur nxt : quickGame nxt rest
quickGame _ [] = []
step :: Dir -> Dir -> Step
step N N = F
step N E = R
step N S = B
step N W = L
step E N = L
step E E = F
step E S = R
step E W = B
step S N = B
step S E = L
step S S = F
step S W = R
step W N = R
step W E = B
step W S = L
step W W = F
main = do
print $ quickGame N [S,W,E,N,N]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359160.html
上一篇:帶可能的分數型別
