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)
GHC实现了你想要的东西:派生机制的扩展.这些修改通常会显示在未来的标准语言扩展中(如haskell'wiki所示)
要启用此扩展,您必须使用以下编译指示
{-# GeneralizedNewtypeDeriving #-}
Run Code Online (Sandbox Code Playgroud)
然后像往常一样使用你的newtype声明派生
data SomeType a = SomeCons a deriving (Num)
Run Code Online (Sandbox Code Playgroud)