给定一个类型,只有一种明显的方式来实现一个Additive
实例,从线性库到它。方便的是,Additive
有一个通用的实现,所以我们可以使用deriving
它。不幸的是,这取决于一个Applicative
实例的存在,它是不可推导的,所以你仍然必须声明它:
{-# LANGUAGE DeriveGeneric, DeriveFunctor #-}
import Linear
import GHC.Generics
import Control.Applicative
data Foo a = Foo a a a deriving (Show, Functor, Generic1)
instance Additive Foo
instance Applicative Foo where
pure x = Foo x x x
Foo f g h <*> Foo x y z = Foo (f x) (g y) (h z)
main = print $ Foo 1 2 3 ^+^ Foo 4 5 6
有什么方法可以自动派生 Additive 而无需声明 Applicative 实例?