给定一个类型,只有一种明显的方法可以实现Additive
实例,从Linear库到它。方便的是,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实例?
答案 0 :(得分:1)
否强>
具有两个完美的Applicative
实例的数据类型的规范示例是[]
/ ZipList
。这证明Applicative
的{{1}}的泛型推导需要以某种方式选择其中一个,而实际上这两个选择都不比另一个更有效。