Функции монад Haskell

Я просматриваю учебник по 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 , который тогда победит всю точку монад, верно?

Любая помощь / мысли будут очень признателен, спасибо.

7
задан Michael 6 December 2011 в 07:13
поделиться