了解列表单子

时间:2019-08-05 00:58:05

标签: list haskell functional-programming monads

我正在“为哈萨克斯坦学到伟大的东西!”这本书中学习单子。由Miran Lipovaca撰写。下面的示例尝试查找骑士在国际象棋中可以从其当前位置到达的所有有效位置:

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')

我无法理解代码的工作原理。对于Maybe,我知道以下几点:

a <- Just 3

a中的值为3。但是,由于列表包含多个元素,<-对列表如何起作用? (c', r')中的值是多少?

0 个答案:

没有答案