有没有办法轻松“解除”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)
。
答案 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