有没有一种方法可以在GHC Haskell中定义现有的量化新类型?

| (GHC)Haskell是否有可能定义一个存在量化的新类型?我知道,如果涉及类型类,则不能在传递字典的实现中完成,但出于我的目的,不需要类型类。我真正想定义的是:
newtype Key t where Key :: t a -> Key t
但是GHC似乎并不喜欢它。目前,我正在使用
data Key t where Key :: !(t a) -> 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)
如in8ѭ 因此,您想确保删除
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
我们可以看到为什么ѭ12the对表示没有任何影响,因为它包含多态成分,因此需要使用通用表示。而没有抬起头的“ 10”是没有意义的,非单例构造函数也没有意义。 我唯一能想到的是,就像存在的记录访问器一样,如果暴露
newtype
,则不透明类型变量将转义。     
我看不出它无法正常运行的任何原因,但ghc可能存在一些内部代表问题。     

要回复问题请先登录注册