给定例如一个类型
data Tree a = Branch (Tree a) (Tree a)
| Leaf a
我可以轻松地为 Functor、Applicative、Monad 等编写实例。
但是如果“包含”类型是预先确定的,例如
data StringTree = Branch StringTree StringTree
| Leaf String
我失去了编写这些实例的能力。
如果我要为我的 StringTree 类型编写函数
stringTreeReturn :: String -> StringTree
stringTreeBind :: String -> (String -> StringTree) -> StringTree
stringTreeFail :: String -> StringTree
-- etc.
满足单子定律,我还能说那StringTree
是单子吗?