紛らわしいタイトルですみません。私は楽しみのために Haskell でパーサー コンビネーター ライブラリを書いています。関連する型の注釈と定義をすべて (私が思うに!) 以下に示します。
data Parser a = Parser (State -> Reply a)
parse :: Parser a -> [Char] -> Either ParseError a
nil :: Parser [a]
nil = Parser $ \state -> Ok [] state
基本的に、parse
関数は a がラップアラウンドする関数をParser
現在の状態に適用し、解析が成功した場合は結果を an にラップしEither
ます。nil
パーサーは状態を受け取り、空のリストの解析が成功したことを返します。だから私たちは持っているべきです、
parse nil "dog" == Right []
実際、これらすべてが存在するモジュールをロードすると、コンパイルされ、True と評価されます。
ただし、実際にはライブラリでいくつかの QuickCheck テストを実行しようとしているので、次のように書きました。
import Parsimony
import Test.QuickCheck
prop_nil :: [Char] -> Bool
prop_nil xs = parse nil xs == Right []
これはコンパイルに失敗します! 次のエラーがスローされます。
No instance for (Eq a0) arising from a use of `=='
The type variable `a0' is ambiguous
この時点で、式が評価されたときに正常に機能するのに、パラメーター化されたバージョンでコンパイルできない理由について、私はほとんど混乱しています。