通常、リストの最初の要素をモナドに入れる関数を実装しようとしていますが、モナドがリストであればリスト全体を返します:モナドの型によって異なる動作をするHaskell関数
putInMonad :: MonadPlus m => [a] -> m a
putInMonad (s:sx) = return s
putInMonad _ = mzero
putInMonad [1,2,3] :: Maybe Int
Just 1
を返す必要があります、と
putInMonad [1,2,3] :: [] Int
は[1,2,3]
を返す必要があります。
アイデア?関数がFoo
インスタンスは関数が呼び出されたときに使用されるかを知ることができないので
下位モナドとして '[[]] Int'を使うことができます。 –
@WillemVanOnsemいいえ、式 'return s'に' sx'に関する情報が含まれていないためです。単に具体的な戻り値の型を指定してもそれは役に立ちません。 – chepner
@chepner:そう、私はそれがその特定のモナドに対して異なって振る舞いません。他の方法で問題を解決するというアイデアしかありませんでした。アイテムのリストではなくリストのリストを与えます。 –