私はAlternative
haskellで型クラスを見ていて、これを発行したときにghciで遊んでいました
some (Just 2)
ハングしたので、Alternative のソース コードを調べました。Alternative のいくつかのデフォルト定義は次のとおりです。
some :: f a -> f [a]
some v = some_v
where
many_v = some_v <|> pure []
some_v = (fmap (:) v) <*> many_v
-- | Zero or more.
many :: f a -> f [a]
many v = many_v
where
many_v = some_v <|> pure []
some_v = (fmap (:) v) <*> many_v
some_v
andが間接的に無限再帰的であることは明らかであり、 andmany_v
に関して定義されていません。empty
<|>
それらがインスタンスによって定義されなければならない場合、デフォルトの定義を持つべきではありませんよね? そして、Maybe
それらを定義していないため、上記のステートメントがぶら下がっているため、ドキュメントに記載されていないため、奇妙に思えます。
では、なぜそのように定義されたのでしょうか。There something I'm missing ですか?