有没有办法在GHC Haskell中定义一种存在量化的新类型?
(GHC)Haskell有可能定义一种存在量化的新类型吗? 我明白,如果涉及类型类,它不能在字典传递的实现中完成,但为了我的目的,不需要类型类。 我真正想定义的是这样的:
newtype Key t where Key :: t a -> Key t
但GHC似乎并不喜欢它。 目前我正在使用data Key t where Key :: !(ta) -> Key t
。 有没有什么办法(可能只是使用-funbox-strict-fields
?)来定义一个与上面的newtype版本具有相同语义和开销的类型? 我的理解是,即使在没有装箱的严格领域,仍然会有一个额外的标签词,尽管我可能在那里完全错误。
这不会导致任何明显的性能问题。 这让我感到惊讶,新的形式是不允许的。 我是一个自然而然的好奇人物,所以我不禁想知道我拥有的版本是否被编译为相同的表示形式,或者是否可以定义任何等效类型。
不,根据GHC:
一个新类型的构造函数不能有一个存在的上下文
但是, data
很好:
{-# LANGUAGE ExistentialQuantification #-}
data E = forall a. Show a => E a
test = [ E "foo"
, E (7 :: Int)
, E 'x'
]
main = mapM_ ((E e) -> print e) test
例如
*Main> main
"foo"
7
'x'
从逻辑上讲,您确实需要在某处分配字典(或标签)。 如果你抹掉了构造函数,那就没有意义了。
注意:尽管如您所暗示的那样,您也不能取消功能,也不能使用多态字段。
有没有什么办法(可能只是使用-funbox-strict-fields
?)来定义一个与上面的newtype版本具有相同语义和开销的类型?
删除-XGADT帮助我思考这个问题:
{-# LANGUAGE ExistentialQuantification #-}
data Key t = forall a. Key !(t a)
在中, Key (Just 'x') :: Key Maybe
所以你想保证Key
构造函数被擦除。
以下是GHC中用于检查newtype
约束的类型的代码:
-- Checks for the data constructor of a newtype
checkNewDataCon con
= do { checkTc (isSingleton arg_tys) (newtypeFieldErr con (length arg_tys))
-- One argument
; checkTc (null eq_spec) (newtypePredError con)
-- Return type is (T a b c)
; checkTc (null ex_tvs && null eq_theta && null dict_theta) (newtypeExError con)
-- No existentials
; checkTc (not (any isBanged (dataConStrictMarks con)))
(newtypeStrictError con)
-- No strictness
我们可以看到为什么!
对表示没有任何影响,因为它包含多态组件,所以需要使用通用表示。 而未newtype
没有意义,也不是非单类构造函数。
我能想到的唯一的事情就是,就像newtype
访问器一样,如果newtype
被暴露,opaque类型变量将会被转义。
我看不出有什么理由不能做,但也许ghc有一些内部代表性问题。
链接地址: http://www.djcxy.com/p/7531.html上一篇: Is there a way to define an existentially quantified newtype in GHC Haskell?