7

因此,当我尝试在使用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

此代码按预期编译。如果我SomeData在 ghci 中构造并且不指定类型,它可以正常工作:

> 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. 有没有人遇到过这个?提前感谢您的帮助。

4

1 回答 1

10

SomeData 2 Nothing :: SomeData 'KindA如果你先工作:seti -XDataKinds。我的想法是加载文件时会合并代码文件中的编译指示,但对于在 REPL 中评估的内容,您还需要在 GHCi 中显式启用它们。

我认为这就像在 GHCi 中,您加载的文件更像是导入的模块,并且 REPL 中的任何代码都有自己的一组语言扩展。在 GHCi 中加载多个文件时,您可能不一定希望所有加载文件中的所有语言扩展都启用/可用。

于 2017-01-04T17:00:26.633 回答