Έχουν δημοσιευτεί
Κυριακή, 20 Δεκεμβρίου 2009 3:53 μμ
από το μέλος
PALLADIN
Μετά από αρκετές αποτυχημένες προσπάθειες, στο να συνδυάσω 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)