私はHaskell型レベルプログラミングについて学びます。私はタイプレベルのリストで、キー、シンボルをルックアップするために少し機能を書いた:タイプファミリをテストするための記号付きのタイプレベルリストを作成する方法
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
type family Lookup (x :: k) (l :: [(k,v)]) :: k where
Lookup k ('(k,a) ': ls) = a
Lookup k ('(x,a) ': ls) = Lookup k ls
Lookup k '[] = TypeError (Text "Key not found: ")
GHC(8.0.1)がエラーなしでこの関数をコンパイルし は、今私はGHCiの中の関数をテストする必要があります。
:set -XDataKinds
:set -XTypeOperators
と最初のテストの例を実行してみてください:文字列「バー」と「foo」がタイプレベルの文字列別名Symbols
でなければなりません
:kind! Lookup "bar" '[("foo", Int), ("bar", String)]
をGHCiの中で、私は、オプションを設定します。質問は、試験例を変更する方法なので、GHCはそれを受け入れるだろう
<interactive>:1:14: error:
• Expected kind ‘[(Symbol, v0)]’,
but ‘'[("foo", Int), ("bar", String)]’ has kind ‘[*]’
• In the second argument of ‘Lookup’, namely
‘'[("foo", Int), ("bar", String)]’
In the type ‘Lookup "bar" '[("foo", Int), ("bar", String)]’
:
GHCは、と私の小さなテストケースを拒否します。
注:私のタイプレベル機能Lookup
は最初のバージョンですが、間違っている可能性があります。CmpSymbol
を使用するか、他の変更を行う必要があります。しかし、これはではなく、このSOの質問の話題です。
私はちょうどことを試してみましたそれに応じて自由に編集することができました。 – chi
ああこれは難しいです:GHCは型レベルのリストでは値のペアはありませんが型のレベルのペアのみが存在することを知るには十分に賢明だと思いました。 – Jogger