7

そのため、 を使用しているときにポリモーフィックな戻り値の型を特定しようとすると、ghci は興味深いエラーを表示しますDataKinds。次のコードがあります。

{-# 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 によって解釈されていないようです。を使用してreplを開始しましたstack ghci。誰もこれに遭遇したことがありますか?助けてくれてありがとう。

4

1 に答える 1

10

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

これは、GHCi ではロードするファイルがインポートされたモジュールに似ており、REPL 内のコードには独自の言語拡張セットがある場合と考えられます。GHCi に複数のファイルをロードするとき、ロードしたすべてのファイルのすべての言語拡張機能を有効/利用可能にする必要があるとは限りません。

于 2017-01-04T17:00:26.633 に答える