在Haskell中提升类实例

Raf*_*ini 13 haskell type-systems typeclass

有没有办法轻松地"提升"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.
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*con 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
Run Code Online (Sandbox Code Playgroud)

输出:

*Main> main
SomeCons 5
Run Code Online (Sandbox Code Playgroud)

  • 因为newtype不能添加任何构造函数或字段 - 它只是重新包装现有类型.这可以确保扩展可以与任何类一起使用,而不仅仅是通常可以为任何数据类型派生的类. (3认同)

Rao*_*ter 5

GHC实现了你想要的东西:派生机制的扩展.这些修改通常会显示在未来的标准语言扩展中(如haskell'wiki所示)

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

{-# GeneralizedNewtypeDeriving #-}
Run Code Online (Sandbox Code Playgroud)

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

data SomeType a = SomeCons a deriving (Num)
Run Code Online (Sandbox Code Playgroud)