このような制約は、指定された制約として現れた場合に型エラーを引き起こします。一般に、これは、型式チェッカが不可能と判断する制約に適用されます。
がさえ
f :: ('True ~ 'False) => x
f = undefined
関数を作成することは、関数のコンテキストは、関数の本体で与えられた制約であるため、です。TypeCheckていない - と'True ~ 'False
は、単に与えられた制約として表示することはできません。
再びEmptyCase
に来る
import Data.Type.Equality ((:~:)(..))
type family (==) (a :: k) (b :: k) :: Bool where
a == a = 'True
a == b = 'False
f :: ((x == y) ~ 'False) => x :~: y -> a
-- f Refl = undefined -- Inaccessible code
f = \case{}
、:~:
でこの時間。 x == x
がTrue
に減少するので、
f :: ((x == y) ~ 'False, x ~ y) => a
も自明不可能制約を減少させることに注意してください。 undefined
せずにこの関数を記述するための方法があるかもしれません
import Data.Type.Equality
f :: ((x == y) ~ 'False, x ~ y) => Proxy '(x,y) -> a
f = undefined
が、それは次のとおりです。あなたが書くことができます自明同じ種類(Data.Type.Equality
で例えば1)のために減少しない等価述語を、書くことができますとにかく議論の余地の並べ替え、このタイプはすぐにGHCによって低減されるので:
>:t f
f :: forall (k :: BOX) (y :: k) a. ((y == y) ~ 'False) => Proxy '(y, y) -> a
でもそこ制約なしに、異なる2と機能Proxy '(y,y) -> a
を呼び出すことdefinitionallyことは不可能ですタイプ。型チェックから平等制約~
を隠す方法はありません。異なる型の等価を使用する必要があります。等しい型は~
に縮小されません。
私は専門家ではありませんが、制約に変数が含まれなくなると、GHCは辞書/証明を生成しようとします。それが失敗すると、タイプエラーが生成されます。例えば、次のような場合に何が起こるかを見ることは興味深いでしょう。 '' c '&& True :: Bool〜Char => Bool'となり、制約が浮動します。おそらく、失敗早期の方法がより効率的であるか、より良いエラーを生成するでしょうか? – chi
['Dict'](' https://hackage.haskell.org/package/constraints-0.6/docs/Data- Constraint.html#g:2)。 –