2017-05-19 7 views
1

私はここで質問した質問の精神の中で、(Generically) Build Parsers from custom data types? @ダニジアーズは美しく動作するソリューションを提供しました。generic-sopとリスト、Data.Proxyなど

fHasParserのインスタンスである場合、fのリストはHasParserのインスタンスでもあります。または、ハスケルでは、

instance (HasParser f) => HasParser [f] where 
    getParser = many' (getParser @f) 

まあ、これはコンパイルされません。次のエラーメッセージが表示されます。

error: Not in scope: type variable ‘f’

これらの言語拡張機能の構文はよくわかりません。特に、とProxyの使用は、私に多くのことを常に混乱させます。読者に最適なドキュメントを見つける場所を教えてください。

+0

あなたは、これは[タイプのアプリケーション](https://ghc.haskell.org/trac/ghc/wiki/TypeApplication)であることを認識し(これはdoesnのGHC-8.0より前には全く働いていませんか?) – leftaroundabout

+0

はい私はそれを認識しています。私はghc 8.0.2を使ってコードをコンパイルしています。 – user2812201

答えて

2

これにはScopedTypeVariablesが必要です。

{-# LANGUAGE ScoperTypeVariables, UnicodeSyntax #-} 

instance ∀ f . HasParser f => HasParser [f] where 
    getParser = many' (getParser @f) 

(ASCII構文instance forall f . HasParser ...も動作します。)

+1

面白いです。 'forall fで。 'コードをコンパイルできませんでした。しかし、私のコードは 'ScopedTypeVariables'言語拡張を有効にしてそのままコンパイルされました。 – user2812201

+0

よくキャッチ! 'data'に' String'フィールドがない限り、コードはコンパイルされます。それ以外の場合、コンパイラは "HasParser [Char]"のインスタンスが重複していると不満を持ちます。これは、私が 'HasParser'のインスタンスとして' Char'を持っていないので、私を混乱させます。 https://pastebin.com/FYrQHa5wのコードを参照してください。コードは 'String'部分なしで正常に動作します。 – user2812201

+0

@ user2812201重複している問題は、 'HasParser String'インスタンスによって引き起こされると思います。 Haskellでは、文字列は実際には文字のリストです。 'Text'のようなものに切り替えることは可能ですか?そうでない場合は、おそらくOVERLAPPABLEプラグマのようなものが動作する可能性がありますhttp://stackoverflow.com/questions/39215103/ghc-overlapping-instances-when-generalising-addition – danidiaz

関連する問題