楽しみのために、パーサー ライブラリを構築しています。このライブラリには、次のParser
データ型があります。
data Parser e a = Parser (String -> Either e (a, String))
Functor
のApplicative
インスタンスを定義することはできますが、パーサーが返す可能性のある「エラー」タイプまたは「値」タイプを制限せずにインスタンスをParser
作成することはできないと思います。もともと、これにより、エラーの種類がメッセージの場合にインスタンスをAlternative
作成する必要がありましたが、この制約を、インスタンスを持つ(または代わりに?) インスタンスを持つ任意のメッセージ データ型にも解放できるはずであることに気付きました。それを念頭に置いて、私はこれを書きました:Applicative
String
Alternative
Monoid
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
instance Alternative e => Alternative (Parser e)
where
empty = Parser $ \s -> Left empty
(<|>) (Parser p1) (Parser p2) = Parser $ \s -> tryParser s p2 $ p1 s
where
tryParser s p2 (Left _ ) = p2 s
tryParser _ _ x = x
残念ながら、これはコンパイルに失敗します。ghci にロードすると、次のエラー メッセージが表示されます。
Parsertest.hs:31:47:
Expecting one more argument to `e'
In the instance declaration for `Alternative (Parser e)'
Failed, modules loaded: none.
オンラインで検索すると、これが解決策のようですが、うまくいきません。私は何が欠けていますか?