gpt4 book ai didi

haskell - 使用 DataKinds 时无法在 GHCI 中指定类型签名

转载 作者:行者123 更新时间:2023-12-02 10:57:02 26 4
gpt4 key购买 nike

因此,当我在使用 DataKinds 时尝试确定多态返回值的类型时,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。以前有人遇到过这种情况吗?预先感谢您的帮助。

最佳答案

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

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

关于haskell - 使用 DataKinds 时无法在 GHCI 中指定类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41469252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com