相关疑难解决方法(0)

GADT类型变量的角色的未来?

昨天的一个问题有一个定义HList(来自HList包)使用数据系列.基本上:

data family HList (l :: [*])
data instance HList '[] = HNil
newtype instance HList (x ': xs) = HCons1 (x, HList xs)

pattern HCons x xs = HCons1 (x, xs)
Run Code Online (Sandbox Code Playgroud)

而不是通常的(IMO更优雅和直观)GADT定义

data HList (l :: [*]) where
  HNil :: HList '[]
  HCons :: x -> HList xs -> HList (x ': xs)
Run Code Online (Sandbox Code Playgroud)

这是因为数据系列版本允许我们强制(我们只能强制执行HList (x ': xs)案例,因为它是a newtype instance,但这就足够了),而GADT只推断一个名义角色l(从而阻止任何强制).(我对上述问题的回答有一个具体的例子.)

HList在这个为期两年的问题中,讨论了GADT角色系统的失败问题.基本上,GHC会自动将任何"类GADT"类型变量标记为名义变量. …

haskell types roles ghc gadt

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

这个GADT实际上是否具有代表性的类型角色

此数据类型可以具有type role HCons' representational representational,允许使用coerce添加或删除应用于元素的新类型,而无需遍历列表.

data HNil' = HNil'
data HCons' a b = HCons' a b
Run Code Online (Sandbox Code Playgroud)

但是,这些列表的语法不如具有以下GADT的语法好

data HList (l::[*]) where
    HNil  :: HList '[]
    HCons :: e -> HList l -> HList (e ': l)
Run Code Online (Sandbox Code Playgroud)

我有一个类在这两个表示之间进行转换,这样Prime (HList [a,b]) ~ HCons' a (HCons' b HNil').该课程是否成功?

coerceHList :: Coercible (Prime a) (Prime b) => HList a -> HList b
coerceHList = unsafeCoerce
Run Code Online (Sandbox Code Playgroud)

安全?

haskell gadt

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

异构列表的笛卡尔积

当然,生成异构列表的笛卡尔积可以在Haskell中以多种方式完成,例如:

[(x,y) | x <- [1,2,3], y <- [4,5,6]]
Run Code Online (Sandbox Code Playgroud)

要么

(,) <$> [1,2,3] <*> [4,5,6]
Run Code Online (Sandbox Code Playgroud)

但我想要的是这样的功能:

heteroCartesian :: 
  (a1, a2, ... , an) -> 
  (b1, b2, ... , bn) -> 
  ((a1,b1), (a1,b2), ... , (a1,bn), (a2,b1), (a2,b2), ... , (a2,bn), (an,b1), ... ,(an,b2), ... , (an,bn))
Run Code Online (Sandbox Code Playgroud)

所以我可以这样做:

f (1,'a',True) (2,'b') == 
((1,2),(1,'b'),('a',2),('a','b'),(True,2),(True,'b'))
Run Code Online (Sandbox Code Playgroud)

我不介意我是使用元组还是其他东西,但我需要像上面一样保留类型信息.

我想要这个的原因是创建测试用例.我有一堆说n功能和m价值观.最终我会将一个函数映射到这些函数上,这些函数将它们全部缩减为相同的类型(a Test)但是到目前为止,n*m我想要执行的测试用例有很多不同的类型(实际上并不是那么简单,因为某些函数只能受限制值的子集).

所以很自然地,将这些异构列表用于其他函数是很好的,例如某些类型map.

我已经看过HList,但它在去年还没有更新过,而且我不确定它是否是最合适的工具.

haskell types ghc hlist

5
推荐指数
2
解决办法
120
查看次数

标签 统计

haskell ×3

gadt ×2

ghc ×2

types ×2

hlist ×1

roles ×1