2017-01-04 6 views
4

DataKindsを使用すると、ghciが多型戻り値の型をピン設定しようとすると面白いエラーが表示されます。私は次のコードを持っています:DataKindを使用しているときにGHCIでタイプシグネチャを指定できません

{-# LANGUAGE DataKinds #-} 
{-# LANGUAGE KindSignatures #-} 
{-# LANGUAGE ExistentialQuantification #-} 
{-# LANGUAGE StandaloneDeriving #-} 

data DataKind 
    = KindA 
    | KindB 

data SomeData (a :: DataKind) = forall c. SomeData 
    { val :: Int 
    , sub :: Maybe (SomeData c) 
    } 

deriving instance Show (SomeData a) 

two :: SomeData 'KindA 
two = SomeData 2 Nothing 

このコードは期待通りにコンパイルされます。私はGHCiの中SomeDataを構築し、タイプを指定しない場合、それは正常に動作します:

> two 
SomeData {val = 2, sub = Nothing} 

> :t two 
two :: SomeData 'KindA 

> SomeData 2 Nothing 
SomeData 2 Nothing :: SomeData a 

をしかし、私は種類のそれの誤りを試してみて、指定した場合:

> SomeData 2 Nothing :: SomeData 'KindA 
<interactive>:745:32-37: error: 
• Data constructor ‘KindA’ cannot be used here 
    (Perhaps you intended to use DataKinds) 
• In the first argument of ‘SomeData’, namely ‘KindA’ 
    In an expression type signature: SomeData KindA 
    In the expression: SomeData 1 Nothing :: SomeData KindA 

引用がされていないことが表示されますghciによって解釈される。私はstack ghciを使ってreplを始めました。誰かがこれまでに遭遇したことはありますか?助けを前にありがとう。

+5

私はそのGHCiのことを信じています。手動で拡張機能を有効にするには、 ':set -XDataKinds'を書いてみてください。何らかの理由で、ファイルを読み込んだときにインタプリタが自動的に読み込まない。 – baxbaxwalanuksiwe

答えて

8

SomeData 2 Nothing :: SomeData 'KindA初めての場合は:seti -XDataKindsとなります。私の考えは、コードファイルのプラグマはファイルのロード時に組み込まれていますが、REPLで評価されたものについては、GHCi内で明示的に有効にする必要があります。

GHCiでロードするファイルは、インポートされたモジュールに似ており、REPLのコードには独自の言語拡張があります。 GHCiで複数のファイルをロードする場合、ロードされたすべてのファイルのすべての言語拡張を有効/有効にする必要はありません。

+0

ありがとう!それは理にかなっている。私は似たような質問を読んでいました。回答の1つは、昇格したコンストラクタを使用するときにのみDataKinds拡張が必要であることに言及しました。これはreplの拡張を有効にする必要があると同じです。 –

+3

':set'の代わりに':seti'を使う方が良いでしょう - ':set *を使うと*これらのオプションで' ghc'を実行しているかのように、*すべての読み込まれたファイル* 。 ':seti'コマンドは、* i * nの使用のための拡張子だけを設定します。例えば、GHCiはデフォルトで ':seti -XNoMonomorphismRestriction'を指定したかのように動作します.GHCiバインドされた変数は単体化されませんが、ロードされたファイルにバインドされた変数はそのままです。 –

+0

@ AntalSpector-Zabusky私は ':seti'を参照する答えを編集しました。私はそのオプションを認識しておらず、それを見ていましたが、この場合、その動作があまり驚くほどではないことに同意します。 – ryachza

関連する問題