Trong "Kiểu dữ liệu a la carte" Swierstra viết rằng cho Free
(mà ông gọi là Term
) và Zero
bạn có thể thực hiện Identity đơn nguyên:Viết đơn nguyên nhận dạng về miễn phí
data Term f a = Pure a
| Impure (f (Term f a))
data Zero a
Term Zero
nay là là Identity monad. Tôi hiểu tại sao điều này xảy ra. Vấn đề là tôi không bao giờ có thể sử dụng như một Term Zero
Monad vì pesky Functor f =>
chế:
instance Functor f => Monad (Term f) where
return x = Pure x
(Pure x) >>= f = f x
(Impure f) >>= t = Impure (fmap (>>=f) t)
Làm thế nào để làm cho Zero
một functor?
instance Functor Zero where
fmap f z = ???
Nó có vẻ như có một mẹo ở đây: Kể từ Zero
không có nhà thầu, Impure
không bao giờ có thể được sử dụng, và do đó các trường hợp Impure
của >>=
không bao giờ được gọi. Điều này có nghĩa là không bao giờ fmap
gọi, vì vậy có một cảm giác mà điều này là ok:
instance Functor Zero where
fmap f z = undefined
Vấn đề là, điều này cảm thấy như gian lận. Tôi đang thiếu gì? Là Zero
thực sự là một Functor? Hoặc có lẽ Zero
không phải là một Functor, và đây là một thiếu sót về cách chúng tôi thể hiện Free
trong Haskell?
có, 'Zero' là một hàm từ' Hask' thành '0', danh mục trống (sau đó được nhúng lại vào Hask). –