sequence :: (Monad m) => [m a] -> m [a]
sequence [] = return []
sequence (x:xs) = x >>= \v -> sequence xs >>= \vs -> return (v:vs)
私が質問のカップルを持っている:シーケンスの定義におけるリターンのアプリケーションはどれくらい柔軟性がありますか?
m
はMonad
です。しかし、リストに「異なる種類」のモナドが含まれている場合、つまりタイプMonad
のコンストラクターの値が異なる場合はどうなりますか?return
と呼ぶことができますか?少なくとも2つの可能性があるため、私は理解しません。[]
と一致する場合はreturn
、空でないリストと照合した場合はreturn
です。
ありがとうございました。今はすべてがクリアです! :) – Gilgamesz
だから、関数型の戻り値の型に基づいたコンパイラは、どの戻り値を呼び出すべきかを推測します。 – Gilgamesz
@Gilgameszタイプが何であるかについて何を知っているかに基づいて決定します。これにはタイプシグネチャが含まれますが、この場合、シグネチャが書き込まれていない場合は、同じタイプを取得します。これは、2番目のケースのタイプから判断できるためです。つまり、シグネチャなしで 'sequence [] = return []'があっただけで、2番目のケースがなければ、 'sequence :: Monad m => [a] - > m [b]'という推論型を取得し、結果はどんなモナドでもあり得る。しかし、リストにはモナドの値が含まれており、2番目のケースの結果はリストの要素と同じモナドにあることがわかります(... – sepp2k