小编m-r*_*aud的帖子

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

所以,当我尝试在使用时确定多态返回值的类型时,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 data-kinds

6
推荐指数
1
解决办法
851
查看次数

如何使用kind ::'[SomeDataKind]处理递归GADT

我认为这是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)

recursion haskell gadt data-kinds

1
推荐指数
1
解决办法
159
查看次数

标签 统计

data-kinds ×2

haskell ×2

gadt ×1

recursion ×1