您的問題似乎集中在將xs
上的遞歸調用的結果與createMove x
的結果相結合。所以,讓我們來介紹一個輔助功能,它將會照顧到這一點!
createMoves:: [Char]-> Moves
createMoves (x:xs) = if xs==[] then Moves [createMove x]
else createHelper (createMove x) (createMoves xs)
現在,createHelper
應該是什麼類型?它的第一個參數是Move
,第二個參數是Moves
,它應該將第一個參數放在第二個包含的Move
列表的前面,並將其重新包裝爲Moves
類型的值。爲了獲得在Move
是清單,你需要使用模式匹配,就像這樣:
createHelper :: Move -> Moves -> Moves
createHelper m (Moves ms) = Moves (m:ms)
這應該做的伎倆,但在Moves
構造這一切的匹配,然後重新應用它是一個有點傻,並有可能效率低下。更好的方法是將[Char]
逐個轉換爲[Move]
,並且僅在最後加上Moves
構造函數。這導致類似(仍與你最初的想法保持):
createMoves :: [Char] -> Moves
createMoves cs = Moves (createMoveList cs)
createMoveList :: [Char] -> [Move]
createMoveList (x:xs) = if xs == [] then [] else createMove x : createMoveList xs
createMoveList
是經常出現在Haskell,即應用功能(在這種情況下,createMove
)每個元素的模式在一個列表中。這是map
函數的本質(如果你還沒有的話,我相信你很快就會在課堂上得到它)。
如果使用該功能,您還可以擺脫createMoves
在給出空列表時失敗的問題。因此,解決辦法我會去爲:
createMoves :: [Char] -> Moves
createMoves cs = Moves (map createMove cs)
或
createMoves = Moves . map createMove
但那是另一回事!
你應該格式化你的代碼...... – Kru 2011-05-27 16:05:47
函數在Haskell中不需要括號。你應該只寫「createMove x」。 – amindfv 2011-05-27 16:39:26
順便說一下,這個'[Char]'是**不是**數組。它是一個*列表*。 – fuz 2011-05-27 16:46:38