2015-04-22 16 views
5

Dato un tipo, esiste un solo modo ovvio per implementare un'istanza Additive, dalla libreria Lineare, ad essa. Convenientemente, Additive ha un'implementazione generica, quindi possiamo usare deriving per questo. Purtroppo, dipende dall'esistenza di un Applicative esempio, che non è derivabile, in modo da avere ancora a dichiararlo:Come derivare genericamente Additivo su Haskell, senza definire un'istanza Applicativa?

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

Esiste un modo per ricavare automaticamente additivo, senza dover dichiarare un'istanza applicativa?

risposta

1

No.

L'esempio canonico di un tipo di dati che ha due perfettamente cromulent Applicative istanze fa []/ZipList. Ciò dimostra che una derivazione generica di Applicative per [] dovrebbe in qualche modo scegliere l'una o l'altra, quando in realtà nessuna delle due opzioni è più valida dell'altra.

Problemi correlati