如何在不定义Applicative实例的情况下在Haskell上一般派生Additive?

时间:2015-04-22 04:08:12

标签: haskell generic-programming linear

给定一个类型,只有一种明显的方法可以实现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实例?

1 个答案:

答案 0 :(得分:1)

具有两个完美的Applicative实例的数据类型的规范示例是[] / ZipList。这证明Applicative的{​​{1}}的泛型推导需要以某种方式选择其中一个,而实际上这两个选择都不比另一个更有效。