代码之家  ›  专栏  ›  技术社区  ›  sdcvvc

haskell-在数据声明中指定种类

  •  7
  • sdcvvc  · 技术社区  · 15 年前

    在本声明中

    data Const a = Const Integer
    

    哈斯克尔推断 Const * -> * . 可以做吗 康斯特 改为使用类型构造函数,因此 (* -> *) -> * ?理想情况下,应该是 a -> * 但没有多态性。 This thread 显示一个解决方案-添加未使用的构造函数。2002年以来情况有变化吗?

    1 回复  |  直到 14 年前
        1
  •  13
  •   Tom Lokhorst    15 年前

    你是对的,因为GHC不支持多态类型,它将做默认的 * .

    但是,使用 KindSignatures 扩展名,您可以显式地为数据声明添加特定类型的注释:

    {-# LANGUAGE KindSignatures #-}
    
    data Const (a :: * -> *) = Const Integer
    

    或者,如果你喜欢 GADT S:

    {-# LANGUAGE GADTs #-}
    
    data Const :: (* -> *) -> * where
      Const :: Integer -> Const a
    

    你现在可以写:

    x :: Const Maybe
    x = Const 2
    

    我刚用实验编制了原始程序 Utrecht Haskell Compiler (UHC)。

    UHC并不真正编译任何现实世界的程序,但它支持类多态性!有趣的是,我们可以推断:

    -- kind of data type:
    Const :: forall a . a -> *
    
    -- type of constructor:
    Const :: Integer -> forall* a . forall b(a) . Const b
    
    推荐文章
    alphacentauri  ·  HOMap实现示例
    10 年前