有没有办法在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?

下一篇: Understanding Haskell's RankNTypes