身份單子的函子可以定義為:
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無法定義這樣的函式,是否意味著IdentityandIdentityF不是同構的,因此身份單子不是真正自由的?
uj5u.com熱心網友回復:
一種合適的定義是:
g (Impure x) = case x of
中沒有分支case。這不是一個錯字。根據需要,案例中的分支與 中的建構式Zero a一樣多;這是一個完整的模式匹配。
(您必須打開EmptyCaseGHC 的擴展程式才能按原樣接受。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466813.html
上一篇:無法從同一個命名空間匯入類
