2012-12-24 16 views

Odpowiedz

19

Lift jest stosunkowo nowy wpis:

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

Oznacza to, że dany funktor f można dostać nowy funktor przez komponowanie f z czystym wartości.

Sam pakiet daje przykład:

-- | 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) 

nie wiem o wszelkich zastosowań in-the-wild z tego jednak.

+2

Przypomina mi o rozszerzeniu półgrupy na monoid: rozszerza funkującego aplikatora-ale-bez-czysty na funktora aplikacyjnego. I to jest obfuskowane w obu przypadkach, ponieważ półgrupy/aplikacje-funktory-ale-bez-czyste nie są obecne w standardowej bibliotece. – dave4420

+14

Jeśli masz jakiś homomorfizm aplikacyjny 'fug :: fu -> gu', to' '(f: +: g)' (gdzie ': +:' jest pointwise suma) może być aplikowany przez "trzymanie się lewej, chyba że fugujesz iść w prawo ". Podnoszenie jest szczególnym przypadkiem, w którym "f" jest początkowym aplikacyjnym, tj. Tożsamością, od której istnieje wyjątkowy homomorfizm do dowolnego innego. – pigworker

+1

Trochę zajmiemy się analizą komentarza @ pigworker - ale po przeczytaniu http://comonad.com/reader/2012/abstracting-with-applicatives/comment-page-1/#comment-107128 w końcu to zignorowałem (i natychmiast go wykorzystaj!). Dzięki! – ocharles