4

私はAlternativehaskellで型クラスを見ていて、これを発行したときに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_vandが間接的に無限再帰的であることは明らかであり、 andmany_vに関して定義されていません。empty<|>

それらがインスタンスによって定義されなければならない場合、デフォルトの定義を持つべきではありませんよね? そして、Maybeそれらを定義していないため、上記のステートメントがぶら下がっているため、ドキュメントに記載されていないため、奇妙に思えます。

では、なぜそのように定義されたのでしょうか。There something I'm missing ですか?

4

1 に答える 1

1

Maybe の代替インスタンスは次のとおりです。

instance Alternative Maybe where
    empty = Nothing
    Nothing <|> r = r
    l       <|> _ = l

andを定義emptyし、 andをデフォルトの実装として(<|>)残します。somemany

値自体に含まれていない「外部の理由」で が成功または失敗する可能性がある場合にmanyandを使用someするのは理にかなっています。Alternative典型的な例はパーサーです。整数が見つからずempty返されるまで、入力ストリームから繰り返し整数を解析しようとします。

しかしJust 2、オルタナティブはいわば「常に成功する」。値を「失敗」させて計算を終了させる可能性のある値の外部には何もありません。それで無限ループに陥ります。

于 2016-09-24T10:06:46.700 に答える