GHC.TypeLits
モジュールのNat
タイプを使用しています。これはプログラマインターフェイスを別のライブラリに定義する必要があると言います。いずれにしても、GHC.TypeLits
は、コンパイル時間Nat
をランタイムInteger
に変換するクラス機能natVal
を有するクラスKnownNat
を有する。また、コンパイル時間Nat
を追加する型関数(+)
があります。タイプレベルナチュラルのクラス制約の回避
問題は(KnownNat n1, KnownNat n2)
と指定されているため、GHCはKnownNat (n1 + n2)
を派生できません。
これは、タイプレベルのナチュラルを追加するたびに追加する必要がある爆発の爆発をもたらします。
data Nat = Zero | Succ Nat
それともtype-naturalのようなライブラリを使用します。
1つの選択肢はそうのような自然数を自分で定義することです。しかし、それは代わりに定義するのでも、あなたがうまく種類のリテラル番号を使用できるようにするGHCに組み込まれたNats、(すなわち0
、1
)を使用しないように愚かなようだ:
N0 = Zero
N1 = Succ N0
etc...
は、この問題を回避とにかくありGHC KnownNat
の問題が全面的に要求されていますか?または、問題のためにモジュールGHC.TypeLits
を無視するだけですか? 「型チェッカープラグインは」威圧少し聞こえる場合は、(それが最初に私にやった)https://hackage.haskell.org/package/ghc-typelits-knownnat
:
[この質問](https://stackoverflow.com/questions/41492754/could-not-deduce-knownnat-in-two-existentials-with-respect-to-the-singletons-lib/41496362)とそれに対応する答え。 – gallais