haskell - 在 Haskell 中提升类实例

标签 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) .

最佳答案

广义的新类型派生扩展是您想要的:

{-# 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

关于haskell - 在 Haskell 中提升类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1816817/

相关文章:

haskell - 如何使用堆栈安装包?

function - 如何在map函数中连接列表-Haskell?

programming-languages - 在 Scala 中访问类外的类型成员

parsing - 如何在 Haskell 中查看派生实例/派生的生成代码

scala - 使用 Seq 自动派生 Cats

scala - 依赖方法类型有哪些引人注目的用例?

scala - 学习scala的小而好的scala项目——尤其是函数式编程和类型系统

haskell - Haskell 中的多态性

scala - 使用 scala 宏表达式创建类似 Haskell 的 where 构造

Haskell:为什么 (+)、(-) 是 Num 类型类的一部分?