恒等单子(monad)的仿函数可以定义为:
data Identity a = Identity a
因为这个 monad 是免费的,所以替代定义如下:
data Term f a = Pure a | Impure (f (Term f a))
data Zero a
type IdentityF a = Term Zero a
由于这是以两种方式定义的同一个 monad,因此它们应该是
可以互相转换。也就是说,一个人应该能够定义两个
功能f :: Identity a -> IdentityF a
和g :: IdentityF a -> Identity a
这样他们的作品f . g
和g . f
是
身份。函数f
很容易定义:
f :: Identity a -> IdentityF a
f (Identity a) = Pure a
但是函数g
呢? ?
g :: IdentityF a -> Identity a
g (Pure a) = Identity a
g (Impure x) = ??????
g (Impure x)
的值应该是多少。我可以尝试欺骗并说出来
是 undefined
但随后f . g
不会是恒等函数并且
Identity
和IdentityF
不会是同构的。
最佳答案
一个合适的定义是:
g (Impure x) = case x of
案例中没有分支
。这不是一个错字。根据需要,case 中的分支数量与 Zero a
中的构造函数数量完全相同;这是一个完整的模式匹配。
(您必须为 GHC 打开 EmptyCase
扩展才能按原样接受此内容。)
关于scala - 作为自由单子(monad)的恒等单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72046457/