使用 DataKinds 时无法在 GHCI 中指定类型签名
Can't specify type signature in GHCI when using DataKinds
因此,当我在使用 DataKinds
时尝试确定多态 return 值的类型时,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。有没有人遇到过这个?在此先感谢您的帮助。
如果您先 :seti -XDataKinds
,SomeData 2 Nothing :: SomeData 'KindA
会起作用。我的想法是代码文件中的编译指示在加载文件时被合并,但对于在 REPL 中评估的内容,您还需要在 GHCi 中明确启用它们。
我认为这是因为在 GHCi 中,您加载的文件更像是导入的模块,REPL 中的任何代码都有其自己的一组语言扩展。在 GHCi 中加载多个文件时,您可能不一定希望所有加载文件中的所有语言扩展名都是 enabled/available.
因此,当我在使用 DataKinds
时尝试确定多态 return 值的类型时,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。有没有人遇到过这个?在此先感谢您的帮助。
:seti -XDataKinds
,SomeData 2 Nothing :: SomeData 'KindA
会起作用。我的想法是代码文件中的编译指示在加载文件时被合并,但对于在 REPL 中评估的内容,您还需要在 GHCi 中明确启用它们。
我认为这是因为在 GHCi 中,您加载的文件更像是导入的模块,REPL 中的任何代码都有其自己的一组语言扩展。在 GHCi 中加载多个文件时,您可能不一定希望所有加载文件中的所有语言扩展名都是 enabled/available.