gpt4 book ai didi

haskell - 用 Free 编写 Identity monad

转载 作者:行者123 更新时间:2023-12-04 01:29:01 27 4
gpt4 key购买 nike

在“点菜数据类型”中,Swierstra 写道,给定 Free (他称之为 Term )和 Zero你可以实现 Identity monad:

data Term f a = Pure a
| Impure (f (Term f a))
data Zero a
Term Zero现在是 Identity monad。我明白为什么会这样。问题是我永远无法使用 Term Zero因为讨厌 Functor f => 作为 Monad约束:
instance Functor f => Monad (Term f) where
return x = Pure x
(Pure x) >>= f = f x
(Impure f) >>= t = Impure (fmap (>>=f) t)

如何制作 Zero仿函数?
instance Functor Zero where
fmap f z = ???

这里似乎有一个技巧:自从 Zero没有构造函数, Impure永远不能使用,所以 Impure >>=的案例永远不会被调用。这意味着 fmap永远不会被调用,所以在某种意义上这是可以的:
instance Functor Zero where
fmap f z = undefined

问题是,这感觉像是作弊。我错过了什么?是 Zero实际上是一个仿函数?或者也许 Zero不是仿函数,这是我们表达方式的一个缺点 Free在 haskell ?

最佳答案

如果你打开DeriveFunctor , 你可以写

data Zero a deriving Functor

但你可能会认为这是作弊。如果要自己写,可以开启 EmptyCase , 而是写出时髦的
instance Functor Zero where
fmap f z = case z of

关于haskell - 用 Free 编写 Identity monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32708525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com