Я просматриваю учебник по 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
сообщал вам, какие шаги вы можете предпринять, чтобы добраться до конечной позиции, если это возможно.
В этом руководстве практически нет упражнений, поэтому у меня проблемы с такими базовыми вещами ... Я думал об изменении возвращаемых значений всех трех функций на [[KnightPos]], где 1 большой список содержит список для каждого возможный порядок ходов. Тогда это, вероятно, будет включать moveKnight, имеющую параметр [KnightPos]
вместо параметра KnightPos
, который тогда победит всю точку монад, верно?
Любая помощь / мысли будут очень признателен, спасибо.