2015-04-22 23 views
5

Bir tür verildiğinde, Linear kitaplığından bir Additive örneğini uygulamanın yalnızca bir açık yolu vardır. Uygun olarak, Additive genel bir uygulamaya sahiptir, bu yüzden bunun için deriving kullanabiliriz. Ne yazık ki, derive olmayan bir Applicative Örneğin, varlığına bağlıdır, bu nedenle hala beyan etmek zorunda: Bir Uygulamalı örneğini bildirmek zorunda kalmadan, otomatik Katkı türetmek için herhangi bir yoluBir Uygulama örneği tanımlamaksızın, Haskell üzerinde jenerik olarak katkı nasıl elde edilir?

{-# 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 

var mı?

cevap

1

sayılı

iki mükemmel cromulent Applicative örneklerini []/ZipList olan sahip olan bir veri türü klasik örneği. Bu, Applicative'un [] için jenerik bir türetmesinin bir şekilde diğerini seçmesi gerektiğini kanıtlayacaktır, aslında hiçbir seçim diğerinden daha geçerli değildir.