5

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

4

1 回答 1

1

不。

具有两个完美 cromulentApplicative实例的数据类型的典型示例是[]/ ZipList。这证明了Applicativefor的泛型推导[]需要以某种方式选择一个或另一个,而实际上这两种选择都不比另一种更有效。

于 2015-05-04T06:24:47.993 回答