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", ""]

所以我们很高兴。