【发布时间】:2013-11-04 11:28:13
【问题描述】:
嗨,我是 Haskell 新手,主要阅读 LYAH 和 Hutton。 最近我遇到了这个sn-p,其中 Functor 实例 一个状态单子,表示为:
instance Functor (State st) where
fmap f m = State $ \st -> let (a, s) = runState m st in (f a, s)
这可以简化为:
instance Functor (State st) where
fmap f m = State $ (\(a,s) -> (f a,s)) . runState m
谁能解释这种减少背后的工作流程?
关于如何学习这种减少技术,还有哪些好的资源/建议?
【问题讨论】:
-
第一个版本实际上是不完整的,它应该是
let (a, s) = runState m st(或者,在模式中,fmap f (State m)。这是否澄清了一些事情?- 请注意,这在最近的 GHC 中都不起作用,因为State不再是简单的newtype,而是根据单子转换器定义。(这很容易解释:只需将State替换为state。) -
您好,我在编写 sn-p 时出错。感谢您的回复。你能解释一下你在模式 fmap (State m) 中的意思吗?也只是单纯的好奇。
-
好吧,在使用 fmapped 值构建“新状态对象”之前,您先解构原始对象。同样,这在标准库中现在不起作用。
标签: haskell functional-programming monads reduction