Haskell Writer Monad疑问:*运算符如何适配Writer对象?
Writer Monad示例中乘法运算符的疑问解答
首先得澄清一个误区:你看到的a*b里的*根本没重载,就是普通的整数乘法。
原因很简单:
- 在do语法里,
a <- logNumber 3这行代码的作用是把logNumber 3返回的Writer [String] Int内部包裹的Int值(也就是3)提取出来,绑定给变量a。同理,b拿到的是logNumber 5里的5,也是个普通Int。 - 所以
a*b就是3乘5,和你平时写的整数乘法没区别。return的作用只是把这个乘法结果(15)重新包装成Writer [String] Int类型,同时它会自动把之前do块里收集的日志(["Got number: 3", "Got number:5"])和自己的空日志合并,最终返回带完整日志的Writer对象。
你可能误以为a和b是Writer对象?但do语法对Monad的核心作用就是帮你“解包”内部值,让你直接操作原始类型,最后再把结果重新打包回Monad结构里。如果真要对Writer对象直接用*,那才需要给Writer实现Num类型类来重载运算符,但你的示例代码里完全没这么做。
内容的提问来源于stack exchange,提问作者guthrie
相关产品推荐
相关产品推荐

