私は単純なDSLのパーサを構築しようとしています。私は次の関数とのトラブルに実行しているよ剛性型変数の問題
:
procP :: ((a->Bool) -> [a] -> Bool) -> String -> Comperator -> ([String] -> Bool)
procP q v c =
case c of
NumE -> q ((==) . unMay . readDouble $ v) . mapMaybe readDouble
NumNE -> q ((/=) . unMay . readDouble $ v) . mapMaybe readDouble
NumLTE -> q ((<=) . unMay . readDouble $ v) . mapMaybe readDouble
NumLT -> q ((<) . unMay . readDouble $ v) . mapMaybe readDouble
NumGTE -> q ((>=) . unMay . readDouble $ v) . mapMaybe readDouble
NumGT -> q ((>) . unMay . readDouble $ v) . mapMaybe readDouble
Exists -> q notBlanks
DatE -> q ((==) . unMay . p_date $ v) . mapMaybe p_date
DatNE -> q ((/=) . unMay . p_date $ v) . mapMaybe p_date
DatLTE -> q ((<=) . unMay . p_date $ v) . mapMaybe p_date
DatLT -> q ((<) . unMay . p_date $ v) . mapMaybe p_date
DatGTE -> q ((>=) . unMay . p_date $ v) . mapMaybe p_date
DatGT -> q ((>) . unMay . p_date $ v) . mapMaybe p_date
TxtE -> q (==v)
TxtME -> (q (==v)) . map (rTrim)
TxtNME -> (q (/=v)) . map (rTrim)
TxtNE -> q (/= v)
次のようにここでの内訳は次のとおりです。
q
は前奏からany
のように動作し、いくつかの機能です。いくつかのバリエーションがありますが、型シグネチャは多かれ少なかれ同じでなければなりません。述語とリストを指定するとboolを返します。
v
は、比較の目的で文字列を入力するため、述語の作成に役立ちます。
c
は、述部でどのタイプの比較を使用するかを表すパーサーによって構築されたトークンタイプです。
はNothing
の値またはエラーJust
を「アンラップする」ための愚かなハック機能です。
readDouble
とp_date
はString
を取り、それぞれ、Maybe Day
またはMaybe Double
のいずれかを返す関数です。
ここで設計意図は、我々は、私がString
として値と比較するかどうかを選択することができるように、内部に入力String
秒を変更するにはどのようなタイプを教えするComparator
トークンを使用していることである、Day
、またはそれぞれDouble
である。
Perlが行うのは、==
vs eq
というスーパーベーシックバージョンのようなものですが、強制的なエラーメッセージはほとんどありません。
私がいる問題はq
に渡されたばかり述語がタイプDouble->Bool
の代わりa->Bool
として提示終わるので、これは、型チェックしないことです、と私はa
は剛性型変数である方法に関するエラーが出ます。
エラーは多少なりとも私には意味がありますが、私は問題を回避する方法を考えています。
誰にもこれを再構成する方法に関するアドバイスはありますか? Rank2Types
上
可能な複製を書く:GHCが型を推論することはできません。型シグネチャエラーによってバインドされた厳格な型の変数](http://stackoverflow.com/questions/22778098/haskell-ghc-cannot-deduce-type-rigid-type-variable-bound-by-the-type-signature) – jberryman
'TxtME'と' TxtNME'の 'rTrim'dでなければなりませんか? – Gurkenglas
@Gurkenglas - ニースキャッチ。ありがとう! –