小编Bry*_*hit的帖子

哈斯克尔:monad monad

我正在学习一些Haskell,我对这些Monads有些麻烦,我了解它们并知道它们是什么,但在这种特殊情况下我有一些问题.在LYAH学习的时候,我遇到了一个练习,这个练习是关于计算你可以用骑士(来自国际象棋游戏)进行3次动作的位置,我们使用这样的列表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')
Run Code Online (Sandbox Code Playgroud)

这是有效的,如果我给这个函数我的位置,它可以很好地计算未来可能的位置,但现在我正在寻找实现其中的Writer monad所以我可以检索我是如何达到这一点的.所以我做了这个功能,

假设,

type KnightRoute = Writer [KnightPos] KnightPos

moveKnight' :: KnightPos -> [KnightRoute]
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 $ toKr (c',r') (c,r)
 where toKr pos oldpos = Writer (pos,[oldpos])
Run Code Online (Sandbox Code Playgroud)

它可以工作,如果我给它一个KnightPos但使用monads我无法KnightPos从a中提取a KnightRoute来执行该函数... …

monads haskell

6
推荐指数
1
解决办法
220
查看次数

标签 统计

haskell ×1

monads ×1