1

楽しみのために、パーサー ライブラリを構築しています。このライブラリには、次のParserデータ型があります。

data Parser e a = Parser (String -> Either e (a, String))

FunctorApplicativeインスタンスを定義することはできますが、パーサーが返す可能性のある「エラー」タイプまたは「値」タイプを制限せずにインスタンスをParser作成することはできないと思います。もともと、これにより、エラーの種類がメッセージの場合にインスタンスをAlternative作成する必要がありましたが、この制約を、インスタンスを持つ(または代わりに?) インスタンスを持つ任意のメッセージ データ型にも解放できるはずであることに気付きました。それを念頭に置いて、私はこれを書きました:ApplicativeStringAlternativeMonoid

{-# 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.

オンラインで検索すると、これが解決策のようですが、うまくいきません。私は何が欠けていますか?

4

1 に答える 1