【发布时间】:2012-12-13 12:21:43
【问题描述】:
我一直在慢慢地移植llvm 包以使用数据类型、类型族和类型nats,并在尝试删除用于分类值的两种新类型(ConstValue 和@ 987654324@) 通过引入一个新的Value 类型,该类型由其常量参数化。
CallArgs 只接受Value 'Variable a 参数,并提供将Value 'Const a 转换为Value 'Variable a 的函数。我想概括CallArgs 以允许每个参数为'Const 或'Variable。这是否可以使用类型族以某种方式对其进行编码?我认为这可能对fundeps是可行的。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
data Const = Const | Variable
data Value (c :: Const) (a :: *)
type family CallArgs a :: *
type instance CallArgs (a -> b) = forall (c :: Const) . Value c a -> CallArgs b
type instance CallArgs (IO a) = IO (Value 'Variable a)
...编译失败:
/tmp/blah.hs:10:1: 非法多态或限定类型: forall (c :: Const)。值 c a 在“CallArgs”的类型实例声明中以下解决方案适用的地方(相当于遗留代码),但需要用户强制转换每个常量Value:
type family CallArgs' a :: *
type instance CallArgs' (a -> b) = Value 'Variable a -> CallArgs' b
type instance CallArgs' (IO a) = IO (Value 'Variable a)
【问题讨论】:
-
评论随机路人:上述非法多态类型错误记录在haskell.org/ghc/docs/latest/html/users_guide/…
-
我不确定,但
forall的优先级是否使得(forall (c :: Const) . Value c a) -> CallArgs b与forall (c :: Const) . Value c a -> CallArgs不同? (即更紧密地将forall分组。) -
@dbaupp:
forall是一个变量绑定结构,类似于 lambda,并且具有基本相同的“优先级”——它的范围在语法上尽可能向右延伸。 -
@dbaupp 我更新了这个问题。我认为这不会从根本上改变问题,因为这两种情况都不受支持。
-
@NathanHowell 哦,那个编辑非常令人惊讶!您是否希望
CallArgs (a -> b)表示一个可以接受Value 'Const a或Value 'Variable a作为其第一个参数的函数(由调用该函数的人自行决定)还是表示一个接受作为其第一个参数的函数可以是Value 'Const a或Value 'Variable a的值(由函数本身决定)?如果是后者,我的答案可能需要更新一下。
标签: haskell type-families