我經歷一個Haskell教程和我給這一段代碼做象棋移動騎士:哈斯克爾單子功能
import Control.Monad
type KnightPos = (Int,Int)
moveKnight :: KnightPos -> [KnightPos]
moveKnight (c,r) = do
(c',r') <- [(c+2,r-1),(c+2,r+1),(c-2,r-1),(c-2,r+1)
,(c+1,r-2),(c+1,r+2),(c-1,r-2),(c-1,r+2)
]
guard (c' `elem` [1..8] && r' `elem` [1..8])
return (c',r')
in3 :: KnightPos -> [KnightPos]
in3 start = return start >>= moveKnight >>= moveKnight >>= moveKnight
canReachIn3 :: KnightPos -> KnightPos -> Bool
canReachIn3 start end = end `elem` in3 start
的鍛鍊是修改功能,使canReachIn3
告訴你什麼如果有可能達到目標位置,您可以採取措施達到最終位置。
本教程基本上沒有練習,所以我遇到了這樣的基本問題......我想將所有3個函數的返回值更改爲[[KnightPos]],其中1個大列表包含每一個可能的移動順序。這可能會涉及再有moveKnight一個[KnightPos]
參數而不是KnightPos
之一,那麼這會破壞單子右側的整點?
任何幫助/想法將不勝感激,謝謝。 「
謝謝。 –