在Haskell中提升类实例

时间:2009-11-29 21:19:29

标签: haskell typeclass type-systems

有没有办法轻松“解除”Haskell中的类实例?

我经常需要为某些类创建Num实例,这些类只是通过类型构造函数“提升”Num结构,如下所示:

data SomeType a = SomeCons a

instance (Num a)=>Num SomeCons a where
    (SomeCons x) + (SomeCons y) = SomeCons (x+y)
    negate (SomeCons x) = SomeCons (negate x)
    -- similarly for other functions.

有没有办法避免这个样板并自动“提升”这个Num结构?当我试图学习存在性时,我通常必须使用Show和其他类来完成此操作,并且编译器不允许我使用deriving(Show)

3 个答案:

答案 0 :(得分:19)

广义的newtype派生扩展是你想要的:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Main where

newtype SomeType a = SomeCons a deriving (Num, Show, Eq)

main = do
  let a = SomeCons 2
      b = SomeCons 3
  print $ a + b

输出:

*Main> main
SomeCons 5

答案 1 :(得分:5)

GHC实现了你想要的:Extensions to the deriving mecanism。 这些修改通常会显示在未来的标准语言扩展中(如haskell' wiki所示)

要启用此扩展程序,您必须使用以下编译指示

{-# GeneralizedNewtypeDeriving #-}

然后像往常一样使用你的newtype声明派生

data SomeType a = SomeCons a deriving (Num)

答案 2 :(得分:1)

GeneralizedNewtypeDeriving