たとえば、次のようなタイプが与えられます
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
ますか?