2012-12-24 14 views
21

Ich schrieb über transformers in einem aktuellen Blog-Post, und jemand fragte: "Was verwenden die Leute Control.Applicative.Lift für?" Ich war nicht in der Lage, dies zu beantworten, also echo ich die Frage StackOverflow - was istControl.Applicative.Lift für verwendet?Was ist Control.Applicative.Lift nützlich für?

Ich sehe ein Beispiel davon im Paket zu verwenden, aber ich bin nicht ganz in der Lage zu analysieren, was es tut. Kennt jemand andere Beispiele in der Wildnis?

Antwort

19

Lift ist ein relativ neuer Beitrag:

data Lift f a = Pure a | Other (f a) 

Das heißt, daß ein Funktor f gegeben ist, können Sie einen neuen Funktors erhalten, indem f mit einem reinen Wert zu komponieren.

Das Paket selbst gibt ein Beispiel:

-- | An applicative functor that collects a monoid (e.g. lists) of errors. 
-- A sequence of computations fails if any of its components do, but 
-- unlike monads made with 'ErrorT' from "Control.Monad.Trans.Error", 
-- these computations continue after an error, collecting all the errors. 
type Errors e = Lift (Constant e) 

-- | Report an error. 
failure :: Monoid e => e -> Errors e a 
failure e = Other (Constant e) 

Ich weiß nicht von irgendwelchen in the wild Verwendungen dies jedoch.

+2

Es erinnert mich daran, eine Semigruppe zu einem Monoid zu erweitern: es erweitert einen anwendungsspezifischen Funktor, aber ohne Reine zu einem anwendungsbezogenen Funktor. Und dies ist in beiden Fällen verschleiert, da Semigruppen/Applikativ-Funktoren-aber-ohne-rein in der Standardbibliothek nicht vorhanden sind. – dave4420

+14

Wenn Sie einen anwendbaren Homomorphismus 'fug :: fu -> gu 'haben, dann kann' (f: +: g) '(wobei': +: 'eine punktweise Summe ist) anwendungsfähig gemacht werden, indem Sie" links halten, wenn Sie nicht fugging haben. " nach rechts gehen ". Lift ist der Spezialfall, bei dem "f" die anfängliche Anwendung ist, d. H. Identität, von der es einen eindeutigen Homomorphismus zu jedem anderen gibt. – pigworker

+1

Es hat ein gutes Stück der Analyse von @ Pigworker Kommentar - aber nach dem Lesen http://comonad.com/reader/2012/abstracting-with-applicatives/comment-page-1/#comment-107128 Ich habe endlich diese (und nutze sofort dafür!). Vielen Dank! – ocharles

Verwandte Themen