2016-06-23 3 views
2

また、When (if ever) can type synonyms be partially applied?で提案されているLiberalTypeSynonyms拡張子を使って次のように試してみました。Idの定義のfに明示的な署名を追加しました。私はまだ同じエラーがあります。私は助けてくれる他の拡張があるかどうかわかりません。Id a = aを部分的にデータD f = D(f())に入力できないのはなぜですか?

これは本当に私を混乱させます。 のf* -> *であり、Id* -> *である。これ以上何がありますか?

+1

部分的に適用される型の同義語は、型チェックラムダと本質的に同等であり、型チェックアルゴリズムがはるかに複雑になります。 GHCはそれらを許可していません。代わりに 'newtype'sまたは' data'sラッパーを使い、必要に応じて値をコンストラクターでラップ/ラップしてください。それ以外の場合は、AgdaまたはCoq:-P – chi

+2

に切り替えてください。ちなみに、リベラル型同義語のルールは、ほんの少しの柔軟性を与えるものではありません。すべての型同義語を展開した後に、まだ部分的に類義語を適用している場合は、型エラーが発生します。代わりに 'type D f = f()'があれば、その拡張はあなたのコードを許可します。しかし 'D f'は' f() 'と同じ型になります。 – chi

+0

@chi私の拡張を明確にしています。残念なことに、私の特に問題では、Dを型シノニムにすることはできませんが、IdとConstをnewtypeにすることで管理できます。あなたの「それはGHCのためには複雑すぎる」というコメントは答えとしての資格があります。あなたがそれを投稿するなら、私はそれを受け入れるかもしれませんが、他の誰かが投稿したいと思ったら、もう少し待つべきかもしれません。 – JoL

答えて

4

ハスケルのタイプシステムは、部分的に適用されたタイプのシノニムまたはファミリ(不飽和とも呼ばれます)をサポートしていません。しかし、dataタイプとnewtypesは部分的なアプリケーションをサポートします。

newtype D f = D (f()) 
newtype Id a = Id a 

d :: D Id 
d = D (Id()) 

newtype sがコンパイル時に消去されているので、あなたが払っている唯一のコストは、構文1です。

+2

それ以外の場合を除いて:(Ed McGettは、 'FunCo ':: Bam'に' liftCoercion :: Maybe(強制ab - >強制(fa)(fb)) 'を' Functor'クラスに追加し、 「Profunctor」は、より一般的に適用できるように強制し、より多くのnewtypeを無料にします。 – dfeuer

関連する問題