2017-05-16 14 views
6

olarak adlandırılır Kombinasyonu bu düz ileri Maybe monad uygulamak için çalıştı. Bu nedenle, temel ifade Nothing ise, tüm ifade Nothing olarak değerlendirilir. Ben foobar beklenenF # hesaplama ifadesi ne zaman

type Maybe<'a> = 
    | Just of 'a 
    | Nothing 
type MaybeBuilder() = 
    member this.Combine ((first, second) : Maybe<'a> * Maybe<'b>) : Maybe<'b> = 
     printfn "Combine called" 
     match first with 
     | Nothing -> Nothing 
     | _ -> 
      match second with 
      | Nothing -> Nothing 
      | _ as a -> a 
    member this.Zero() = Just() 
    member this.Bind((m, f) : Maybe<'a> * ('a -> Maybe<'b>)) = 
     printfn "Bind called" 
     match m with 
     | Nothing -> Nothing 
     | Just a -> f a 
let MaybeMonad = MaybeBuilder() 
let foobar = 
    MaybeMonad { 
     let! foo = Just "foo" 
     Just 1 
     Nothing 
    } 

Just "foo" >>= fun foo -> Combine(Just 1, Nothing) çevrilmesi, ancak Combine çağrılmadı.

cevap

7

Hesaplama ifadesinin yazılması beklenen yol bu değil.

let foobar = 
    MaybeMonad { 
     let! foo = Just "foo" 
     return! Just 1 
     return! Nothing 
    } 

: Eğer istediğiniz her zaman (! !, verim iade veya verim, dönüş) ifadesinin sol tarafında bazı anahtar kelime eklemek gerekir 'bir sonuç elde', sizin örnekte ben bir return! eklersiniz

member this.Delay(x) = x() 
:

member this.ReturnFrom (expr) = expr 

sonra derleyici sana böyle bir şey arıyorsanız düşündüğünüz durumda bir gecikme yöntemi eklemek isteyecektir: Ama sonra oluşturucu tanımını eklemem gerekiyor

Neredeyse oldu, şimdi bir değer kısıtlaması var, büyük olasılıkla her iki argüman üzerinde aynı tür kullanmaz tanımlanan Combine, bunu düzeltmek ya da sadece dönüş türü bir tür ek açıklaması ekleyebilir ya çünkü:

let foobar : Maybe<int> = 
    MaybeMonad { 
     let! foo = Just "foo" 
     return! Just 1 
     return! Nothing 
    } 
bu kadar

, şimdi olsun:

Bind called 
Combine called 

basılı ve:

val foobar : Maybe<int> = Nothing 

Eğer ces tüm ayrıntılarını anlamak istiyorsanız bu güzel yazıya bir göz: https://www.microsoft.com/en-us/research/publication/the-f-computation-expression-zoo/

+4

Ve bu makaleyi şu güzel makale dizisiyle takip edin: https://fsharpforfunandprofit.com/series/computation-expressions.html – rmunn

İlgili konular