リストモナドに独自のインスタンスを提供したいと思います。残念ながら、以下はコンパイル時にインスタンス宣言の重複エラーを引き起こします。
myReturn :: a -> [a]
myBind :: [a] -> (a -> [b]) -> [b]
instance Monad [] where
return = myReturn
(>>=) = myBind
ドキュメントを見ると、インポート時にインスタンス宣言を非表示にすることはできないようで、リストモナドのインスタンスはプレリュードですでに宣言されているため、インポート自体を取り除くこともできないと思います。
do ブロックはおそらくandのアプリケーションの構文糖衣にすぎないため、自分の実装を使用して do ブロックを使用できるように、少なくとも rebind (>>=)
andできるのではないかと考えました。return
(>>=)
(>>)
let
return = myReturn
(>>=) = myBind
in
do
item1 <- list1
item2 <- list2
return (item1, item2)
残念ながら、デフォルトのリストモナドインスタンスを(>>=)
まだ使用しているため、ブロックは別の場所から取得しているようです。(>>=)
リストモナドの実装(>>=)
とreturn
インスタンスを作成する方法、または少なくとも do ブロックでそれらを使用する方法はありますか?