Έχουν δημοσιευτεί Κυριακή, 20 Δεκεμβρίου 2009 3:53 μμ από το μέλος PALLADIN

Abstracting over 'M' (in F#)

Μετά από αρκετές αποτυχημένες προσπάθειες, στο να συνδυάσω Type constructor polymorphism και LINQ syntax, αποφάσισα
να δοκιμάσω τις ίδιες ιδέες σε F#.

Η F# υλοποίηση είναι ακριβώς ίδια με την αντίστοιχη σε C#, με την μονη διαφορα ότι το Monad generalization δουλεύει με το ειδικό
syntax support που μας παρέχουν τα computation expressions.

[<AbstractClass>]
type MonadDef<'M when 'M :> MonadDef<'M>>() as this = 
     let (>>=) m f = this.Bind(m, f)
     let unit v = this.Return v

     abstract member Return<'T> : 'T -> IMonad<'T,'M> 
     abstract member Bind<'T, 'S> : IMonad<'T,'M> * ('T -> IMonad<'S,'M>) -> IMonad<'S,'M> 
    
     member this.Then<'T, 'S>(firstM : IMonad<'T, 'M>, secondM : IMonad<'S, 'M>) : IMonad<'S, 'M> =
        firstM >>= fun _ -> secondM

     member this.Map<'T, 'S>(f : 'T -> 'S, m : IMonad<'T, 'M>) : IMonad<'S, 'M> =
        m >>= fun v -> unit (f v)

     member this.Apply<'T, 'S>(mf : IMonad<'T -> 'S, 'M>, m : IMonad<'T, 'M>) : IMonad<'S, 'M> =
        mf >>= fun f -> m >>= fun v -> unit (f v)   

     member this.Join<'T>(m : IMonad<IMonad<'T, 'M>, 'M>) : IMonad<'T, 'M> =
        m >>= id

and IMonad<'T,'M when 'M :> MonadDef<'M>> = interface end 

type Maybe<'T> = 
    | Nothing 
    | Just of 'T 
    interface IMonad<'T, MaybeDef> 
and 
    MaybeDef() = 
        inherit MonadDef<MaybeDef>() with
            override this.Return<'T>(v : 'T) : IMonad<'T, MaybeDef> = 
                Just v :> _ 
  
            override this.Bind<'T,'S>(m : IMonad<'T, MaybeDef>, f : 'T -> IMonad<'S, MaybeDef>) : IMonad<'S,MaybeDef> = 
                match m :?> _ with 
                | Nothing -> Nothing :> _ 
                | Just x  -> f x 


let maybe = new MaybeDef() 

let toMaybeString a = 
    maybe { 
        let! v = Just a  
        return v.ToString()
    }

printfn "%A" (toMaybeString 42)
Share


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

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

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

Σχόλια:

 

napoleon έγραψε:

:)

Δεκεμβρίου 21, 2009 2:30 μμ
 

napoleon έγραψε:

:)

Δεκεμβρίου 21, 2009 2:31 μμ
 

Thoughts and Code έγραψε:

Έχοντας αναπτύξει όλο το απαραίτητο machinery ( 1 , 2 ), μπορούμε να συνεχίσουμε με την ίδια αφαιρετική

Φεβρουαρίου 7, 2010 11:47 μμ

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

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