また、When (if ever) can type synonyms be partially applied?で提案されているLiberalTypeSynonyms拡張子を使って次のように試してみました。Id
の定義のf
に明示的な署名を追加しました。私はまだ同じエラーがあります。私は助けてくれる他の拡張があるかどうかわかりません。Id a = aを部分的にデータD f = D(f())に入力できないのはなぜですか?
これは本当に私を混乱させます。 のf
は* -> *
であり、Id
は* -> *
である。これ以上何がありますか?
部分的に適用される型の同義語は、型チェックラムダと本質的に同等であり、型チェックアルゴリズムがはるかに複雑になります。 GHCはそれらを許可していません。代わりに 'newtype'sまたは' data'sラッパーを使い、必要に応じて値をコンストラクターでラップ/ラップしてください。それ以外の場合は、AgdaまたはCoq:-P – chi
に切り替えてください。ちなみに、リベラル型同義語のルールは、ほんの少しの柔軟性を与えるものではありません。すべての型同義語を展開した後に、まだ部分的に類義語を適用している場合は、型エラーが発生します。代わりに 'type D f = f()'があれば、その拡張はあなたのコードを許可します。しかし 'D f'は' f() 'と同じ型になります。 – chi
@chi私の拡張を明確にしています。残念なことに、私の特に問題では、Dを型シノニムにすることはできませんが、IdとConstをnewtypeにすることで管理できます。あなたの「それはGHCのためには複雑すぎる」というコメントは答えとしての資格があります。あなたがそれを投稿するなら、私はそれを受け入れるかもしれませんが、他の誰かが投稿したいと思ったら、もう少し待つべきかもしれません。 – JoL