scala - 作为自由单子(monad)的恒等单子(monad)

标签 scala haskell monads category-theory free-monad

恒等单子(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 ag :: IdentityF a -> Identity a这样他们的作品f . gg . 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不会是恒等函数并且 IdentityIdentityF不会是同构的。

最佳答案

一个合适的定义是:

g (Impure x) = case x of

案例中没有分支。这不是一个错字。根据需要,case 中的分支数量与 Zero a 中的构造函数数量完全相同;这是一个完整的模式匹配。

(您必须为 GHC 打开 EmptyCase 扩展才能按原样接受此内容。)

关于scala - 作为自由单子(monad)的恒等单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72046457/

相关文章:

scala - Scala 中类型类的动机是什么?

Haskell:检查所有条件是否为真。如果他们是返回真否则假

haskell - parsec:有没有一种简单的方法可以在语法中随处允许注释/空格?

windows - Haskell 用户界面框架?

haskell - Haskell中的"Truly"惰性IO

scala - 找不到参数 lgen : shapeless. LabelledGeneric.Aux 的隐式值

java - 在 SCALA 中使用动态值进行 Base64 JAVA 编码 - GATLING

Haskell 解析器、Monad 和 MonadPlus

scala - Spark Bucketizer - 即使没有元素也显示所有桶

haskell - Control.Applicative.Lift 有什么用?