list monad 不是一个免费的 monad,而是……
The list monad is not a free monad but …
在 One Monad to Prove Them All 的第 12 页上写道:“ [容器] 的一个突出示例是列表数据类型。列表可以由列表的长度和列表中的函数映射位置".
起初我以为这个容器上的自由 monad 将与列表 monad 同构。
但是在第 12 页上写到“列表 monad 不是自由 monad,因为列表 monad 与自由 monad 的实例不同构 ".
那么上面容器上的free monad是什么?它同构于什么?为什么它不与列表 monad 同构?可以通过商同构吗?
我觉得还是要小心一点。
我不认为如果 M
是一个自由 monad,那么应用自由 monad 构造会让你得到与 M
同构的东西。因此,您的问题“X
上的自由 monad 是什么”实际上与“X
的自由 monad 是什么函子?”无关。为了证明 monad M
不是一个自由的 monad,我们唯一需要做的就是展示一些对 M
正确但 monad 法则没有暗示的相等性——因为 free monad 构造的意思 是它保证了 monad 法则,仅此而已。
这是对列表执行此操作的一种方法:
f False = ""
f True = "x"
g False = "x"
g True = ""
is = [False, True]
现在 is >>= f
= is >>= g
(= "x"
) 尽管 f
!= g
.
一个单独的问题是通过将自由构造应用于列表你得到了什么monad。作为一种直觉,思考自由 monad 构造的一种方式是,它是它转换的事物的任意(和异构)深度嵌套版本。对于列表,这意味着
这样的值
[[[0], [1, [2, 3], 4]], [5,6,7]]
会成为自由建设的成员。如果您稍微考虑一下,您会发现另一种思考方式是将其视为一棵树,其叶子(仅)有数据,并且每个内部节点都允许有任意数量的子节点。
只是为了好玩,我们可以仔细检查我们没有验证之前的相等性。这次我们得到
is >>= f = ["", "x"]
is >>= g = ["x", ""]
所以我们很高兴。
在 One Monad to Prove Them All 的第 12 页上写道:“ [容器] 的一个突出示例是列表数据类型。列表可以由列表的长度和列表中的函数映射位置".
起初我以为这个容器上的自由 monad 将与列表 monad 同构。
但是在第 12 页上写到“列表 monad 不是自由 monad,因为列表 monad 与自由 monad 的实例不同构 ".
那么上面容器上的free monad是什么?它同构于什么?为什么它不与列表 monad 同构?可以通过商同构吗?
我觉得还是要小心一点。
我不认为如果 M
是一个自由 monad,那么应用自由 monad 构造会让你得到与 M
同构的东西。因此,您的问题“X
上的自由 monad 是什么”实际上与“X
的自由 monad 是什么函子?”无关。为了证明 monad M
不是一个自由的 monad,我们唯一需要做的就是展示一些对 M
正确但 monad 法则没有暗示的相等性——因为 free monad 构造的意思 是它保证了 monad 法则,仅此而已。
这是对列表执行此操作的一种方法:
f False = ""
f True = "x"
g False = "x"
g True = ""
is = [False, True]
现在 is >>= f
= is >>= g
(= "x"
) 尽管 f
!= g
.
一个单独的问题是通过将自由构造应用于列表你得到了什么monad。作为一种直觉,思考自由 monad 构造的一种方式是,它是它转换的事物的任意(和异构)深度嵌套版本。对于列表,这意味着
这样的值[[[0], [1, [2, 3], 4]], [5,6,7]]
会成为自由建设的成员。如果您稍微考虑一下,您会发现另一种思考方式是将其视为一棵树,其叶子(仅)有数据,并且每个内部节点都允许有任意数量的子节点。
只是为了好玩,我们可以仔细检查我们没有验证之前的相等性。这次我们得到
is >>= f = ["", "x"]
is >>= g = ["x", ""]
所以我们很高兴。