【发布时间】:2018-01-04 18:45:30
【问题描述】:
我正在阅读一本关于列表单子的在线 Haskell 书籍。在书中,list monad 是这样定义的:
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs)
fail _ = []
然后有一个这样的 list monad 用法示例:
Prelude> [1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch)
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
我是 Haskell 的新手,我对这个示例的疑问是,变量“n”如何在 return (n,ch) 的 lambda 表达式中可用。 n 在另一个 lambda 表达式中定义,我不明白为什么在一个 lambda 表达式中定义的变量在后续 lambda 表达式中可用。我尝试根据列表单子定义转换如下示例:
Prelude> concat (map (\ch -> return (n, ch)) (concat (map (\n -> ['a', 'b']) [1, 2])))
<interactive>:32:29: error: Variable not in scope: n
但正如您所见,我收到一条错误消息,指出变量 n 在另一个 lambda 表达式的范围内不可用。也许这本书只是介绍了列表单子定义的简化版本?
【问题讨论】: