2017-08-14 20 views
2

私はhaskellにレクサーを書きたいと考えていましたが、私はこれらの関数を見つけました。Haskell Alternativeの "some"関数と "many"関数の定義の意味は何ですか

定義され、いくつかの多くは 方程式の最小解すべきか:

some v = (:) <$> v <*> many v

many v = some v <|> pure []

私はいくつかの中(:)が解除されることを取得し、 vの値に適用され、それを 'many v'で返されたリストの先頭に追加します。しかし、なぜ多くの人の定義はいくつかで始まるのですか?そしてそれはなぜ純粋な[]と連結されるのでしょうか?これらの2つの機能の関係や違いは何ですか?これらの方程式の中で最も解けないのは、何人か、そして多くの人にとって、どういう意味ですか?そして再帰はどのように止まるでしょうか?助けて!

+7

それは* '[]'純粋で*連結されません。空リストは、再帰が停止する*代替*です。 – Bergi

+7

「some」は「少なくとも1つ」を意味し、「many」は「1つ以上」を意味する。 – Bergi

+0

ありがとうございます。私はこれが理にかなっていると思います。したがって、少なくとも1つの値、0以上の値、および多くの場合、少なくとも1つの値(0以上の値)*または*が保証されます。しかし、再帰はどのくらい正確に終了しますか? vの値はどのように消費されますか? – northlane

答えて

4
  • some pは、p
  • many pの以上の一致が入力​​、many lettersome letterに対するp

ゼロ以上で一致が両方abcを解析する手段。

しかし、入力"123"の場合、many letterは空の文字列""を出力します。 some letterはエラーを報告します。

定義によると、 some vは少なくともvの1つの一致を必要とするので、最初にvを解析し、次にvの0以上の一致が必要です。これはmany vです。

some v = do 
    first_match <- v 
    rest_matches <- many v 
    return $ first_match : rest_matches 

some v = (:) <$> v <*> many vと同じです。

しかし、many vの場合。それはsome v(1以上)または何も(純粋な[])に一致します。

many v = if matches (some v) then return (some v) else return nothing

codewarsからwriting applicative parsers from scratchを解決できます。

Functional pearlsも、コンバイナの解析については非常に参考になります。


  1. https://www.codewars.com/kata/writing-applicative-parsers-from-scratch
  2. http://www.cs.nott.ac.uk/~pszgmh/pearl.pdf
+0

これは私にとって非常に便利です、ありがとう! – northlane

関連する問題