所以,当我尝试在使用时确定多态返回值的类型时,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
Run Code Online (Sandbox Code Playgroud)
此代码按预期编译.如果我SomeData在ghci中构造并且没有指定类型它可以正常工作:
> two
SomeData {val = 2, sub = Nothing}
> :t two
two :: SomeData 'KindA
> SomeData …Run Code Online (Sandbox Code Playgroud) 我认为这是Haskell类型系统扩展中最远的,我甚至已经遇到过,我遇到了一个我无法弄清楚的错误.提前道歉,这是我能创造的最短的例子,它仍然说明了我所拥有的问题.我有一个递归的GADT,其类型是一个提升列表,如下所示:
GADT定义
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeOperators #-}
data DataKind = A | B | C
-- 'parts' should always contain at least 1 element which is enforced by the GADT.
-- Lets call the first piece of data 'val' and the second 'subdata'.
-- All data constructors have these 2 fields, although some may have
-- additional fields which I've omitted …Run Code Online (Sandbox Code Playgroud)