Έχουν δημοσιευτεί Κυριακή, 7 Φεβρουαρίου 2010 11:40 μμ από το μέλος PALLADIN

LiftM'e' up Scotty

Έχοντας αναπτύξει όλο το απαραίτητο machinery (1, 2), μπορούμε να συνεχίσουμε με την ίδια αφαιρετική διάθεση και να "ανεβάσουμε" στον κόσμο του 'M',
συναρτήσεις με ένα, δυο ή περισσότερα arguments.

// liftM declarations
let liftM<'M, 'A1, 'R when 'M :> MonadDef<'M>> (m : MonadDef<'M>) (f : 'A1 -> 'R) 
                                               (a : IMonad<'A1, 'M>) : IMonad<'R, 'M> = 
                                               m.Map(f, a)

let liftM2<'M, 'A1, 'A2, 'R when 'M :> MonadDef<'M>> (m : MonadDef<'M>) (f : 'A1 -> 'A2 -> 'R) 
                                                     (a : IMonad<'A1, 'M>) (b : IMonad<'A2, 'M>) : IMonad<'R, 'M> =
                                                     m.Apply(liftM m f a, b)

let liftM3<'M, 'A1, 'A2, 'A3, 'R when 'M :> MonadDef<'M>> (m : MonadDef<'M>) (f : 'A1 -> 'A2 -> 'A3 -> 'R) 
                                                          (a : IMonad<'A1, 'M>) (b : IMonad<'A2, 'M>) 
                                                          (c : IMonad<'A3, 'M>) : IMonad<'R, 'M> =
                                                          m.Apply(liftM2 m f a b, c)  

//liftM example
let result = liftM2 listM (+) (listM.OfList [0; 1]) (listM.OfList [0; 2])
printfn "%A" result //[0; 2; 1; 3]

Haskell inspiration
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html

 

Share



Attachment(s): GenericMonads.zip

Ενημέρωση για Σχόλια

Αν θα θέλατε να λαμβάνετε ένα e-mail όταν γίνονται ανανεώσεις στο περιεχόμενο αυτής της δημοσίευσης, παρακαλούμε γίνετε συνδρομητής εδώ

Παραμείνετε ενήμεροι στα τελευταία σχόλια με την χρήση του αγαπημένου σας RSS Aggregator και συνδρομή στη Τροφοδοσία RSS με σχόλια

Σχόλια:

Χωρίς Σχόλια

Ποιά είναι η άποψή σας για την παραπάνω δημοσίευση;

(απαιτούμενο)
απαιτούμενο
προαιρετικό
απαιτούμενο
ÅéóÜãåôå ôïí êùäéêü:
CAPTCHA Image