それParser x
がを解析するパーサーであると仮定しx
ます。このパーサーはおそらくmany
、ゼロ個以上の何かの発生を解析する(アイテムパーサーが失敗すると停止する)コンビネーターを持っています。
Parser
モナドを形成する場合、それをどのように実装できるかがわかります。Parser
Applicative Functorだけの場合、その方法がわかりません。前の結果を確認して次に何をするかを決定する方法はないようです(正確にはモナドが追加する概念)。何が足りないのですか?
Alternative
型クラスは提供しmany
コンビネータを:
class Applicative f => Alternative f where
empty :: f a
(<|>) :: f a -> f a -> f a
many :: f a -> f [a]
some :: f a -> f [a]
some = some'
many = many'
many' a = some' a <|> pure []
some' a = (:) <$> a <*> many' a
many a
コンビネータ手段「ゼロ個以上」a
。some a
コンビネータ手段「1つ以上」a
。したがって:
some a
コンビネータは、1のリストを返すa
に続いてmany a
(つまり1 + (0 or more)
)。many a
コンビネータリターンのいずれかsome a
または空のリスト(すなわち(1 or more) | 0
)。many
コンビネータは依存(<|>)
JavaScriptのような言語でのデフォルトの演算子とみなすことができる演算子。たとえば、次のAlternative
インスタンスについて考えてみますMaybe
。
instance Alternative Maybe where
empty = Nothing
Nothing <|> r = r
l <|> _ = l
基本的に、(<|>)
それが真実である場合、は左側の値を返す必要があります。それ以外の場合は、右側の値を返す必要があります。
AParser
は、次のように定義されたデータ構造ですMaybe
(Applicativeレクサーコンビネーターとパーサーコンビネーターの考え方は基本的に同じです)。
data Lexer a = Fail | Ok (Maybe a) (Vec (Lexer a))
解析が失敗した場合、Fail
値が返されます。それ以外のOk
場合は、値が返されます。以来Fail <|> pure []
IS pure []
、これはどのようにmany
停止し、空のリストを返すようにする場合コンビネータが知っています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加