在对one of my answers的评论中,SO用户sdcwc基本上指出了以下代码:
comb 0 = [[]]
comb n =
let rest = comb (n-1)
in map ('0':) rest
++ map ('1':) rest
可以替换为:
comb n = replicateM n "01"
让我完全惊呆了。
现在我正在寻找教授这些高级概念的教程,书籍或PDF。我不正在寻找针对初学者或在线参考文献的“什么是monad”教程,以解释replicateM
的类型。我想学习如何在monad中思考并有效地使用它们,如果你愿意,可以使用monadic“模式”。
答案 0 :(得分:10)
从我的角度来看(这当然不是普遍的),我对列表monad无动于衷 - 在你的例子中,我(弱)认为,因为有很多列表函数,它就像巧合一样好解决方案是monadic功能而不仅仅是列表功能(或通过Data.Traversable或Data.Foldable功能列表的概括)。
对于monadic模式我更多地考虑效果而不是特定的组合器 - 状态模型读写状态,Reader模型只读“状态”,Writer模型只写“状态”,也许模型偏好(所以它可以模拟错误而不用错误消息),Either / Error模型错误与有形错误代码或消息。当你掌握效果时 - 你很快意识到你需要将它们结合起来,这样monad变换器变得很重要。
除了“编程的乐趣”之外,还没有任何关于高级Haskell的书籍 - 这是一本多作者的书,收集了一些完全不同的作品,因此在决定它是否是一本书之前值得浏览一本我想要的。理查德伯德的新书有很多高级编码的例子,但它用简单优雅的代码完成。虽然它不是一本关于高级语言功能的书,但它是一本非常好的书。
在没有书籍的情况下,论文是最好的地方,因为它们比博客更精致。最相关的是Haskell研讨会(以前称为Haskell研讨会),查看下面的链接,查看将列出所提交论文的会议记录,然后搜索您感兴趣的任何内容 - 在大多数情况下,作者公开发表论文可用。
答案 1 :(得分:10)
使用sequence
,filterM
,liftM2
,join
等功能,并考虑它们如何为每个monad IO
,[]
,{ {1}},(->) a
,Writer
。例如,IO monad的State
按顺序执行IO操作:
sequence
写下签名并尝试使用它们。有些组合很有意思,有些组合较少。
过滤器示例:
[IO a] -> IO [a]
{-# LANGUAGE NoMonomorphismRestriction #-}
import Control.Monad
import Control.Monad.State
import Control.Monad.Reader
a = filterM (\x -> do putStrLn $ "Put " ++ show x ++ "?"
fmap (=="Y") getLine)
b = filterM (const [False,True])
c m xs = runState (filterM k xs) 0
where k x = do a <- get
let p = a + x <= m
when p $ put (a+x)
return p
d = filterM (flip id)
使用IO过滤列表 - 它会询问用户每个项目。
a
以不确定的方式过滤列表 - 每个项目都是不确定的,不包括在内。结果,你获得了powerset。 (试试吧!)
b
过滤列表,维护状态。在这种情况下,这是贪婪的背包 - 你有容量c
的背包,并希望从m
插入尽可能多的项目。
xs
过滤列表,保持只读状态。这不好玩。我使用过滤功能作为状态,这给出了d
。
单个函数flip filter
可以执行所有这些操作。
如果您要为其他函数编写类似的代码,您将获得足够的直觉来注意其他地方的monadic函数。例如,如何获得以下功能?
filterM
以及dup f x = f x x
怎么办?
答案 2 :(得分:9)
这段代码实际上结合了两个关于Haskell的非常隐含的事实:
以下代码段是等效的:
replicateM n "12"
replicateM n ['1', '2']
replicateM n $ do c <- ['1', '2']
return c
我认为最后一个版本实际上最清楚地显示了在这种情况下会发生什么:我们可以在“1”和“2”之间进行选择,并且这些选择中的n个被链接在一起。一旦你理解了这一点,你就像你需要的Haskell理解一样先进。其余的只是一点混淆。
答案 3 :(得分:7)
monad真正狂野/令人敬畏的东西是当你超越状态monad及其子集 - 作家和读者 - 并开始考虑Cont和List,以及它们在回溯,组合和搜索方面的含义。我稍后会提供更多参考资料,但Oleg和Chung-chieh Shan的LogicT论文是一个好的开始:http://okmij.org/ftp/Computation/monads.html
EZ Yang在MR 15的三个monad中的冒险经历:http://themonadreader.files.wordpress.com/2010/01/issue15.pdf这个问题的答案也可能有趣:Creative uses of monads
答案 4 :(得分:5)
在TMR13中查看Typeclassopedia。没有其他人建议它,它帮助我思考了Haskell提供的各种类型类。
注意:它正在更新为second edition,但第一版仍然具有相关性和信息量。
答案 5 :(得分:1)
我学习Haskell语言的好概念的两个好消息来源是http://learnyouahaskell.com/和http://www.realworldhaskell.org/blog/这两个都可以在线免费使用。) - 我希望他们可以给你一些进一步的好步骤。即使他们没有教授最先进的概念,他们也可以很好地了解那里有什么以及它可能有用的东西。