2013-10-08 90 views
0

我有麻煩了以下內容:詮釋選項,而不是詮釋在F#

let safeDiv x y = 
    match (x,y) with 
    | (_, Some 0) -> None 
    | (Some xx, Some yy) -> Some (xx/yy) 
    | _ -> None 

當我在Visual Studio中的交互窗口,像這樣運行這個簡單的功能:

safeDiv 4 2 

我得到以下錯誤...

此表達式預計有類型int選項,但這裏有類型int。

難道是我想用的safeDivSome(4)Some(2)?這也行不通...

回答

2

好的,這是過度殺傷,但我最近做了類似的事情。

首先,我所定義的選項類型的計算表達式生成:

type OptionBuilder() = 
    member this.Bind(x, f) = Option.bind f x 
    member this.Return(x) = Some x 
    member this.ReturnFrom(x) = x 

let opt = new OptionBuilder() 

然後我定義類型浮體的功能子 - >浮 - > float選項

let sub x y = if y = 0.0 then None else Some (x/y) 

最後,我使用OptionBuilder將saveDiv定義爲浮動選項 - >浮動選項 - >浮動選項

let safeDiv x y = opt { let! a = x 
         let! b = y 
         return! sub a b } 

你可以閱讀更多有關的計算式的維基:http://en.wikibooks.org/wiki/F_Sharp_Programming/Computation_Expressions

如果你想更深入地瞭解這背後的理論,你可以看到這篇論文由Tomas Petricek和唐賽姆:http://www.cl.cam.ac.uk/~tp322/drafts/notations.pdf

1

您的第二個版本已經接近。

應該

safeDiv (Some(4)) (Some(2)) 

額外的支架必須確保功能的正確順序應用。

1

您構建了一個具有簽名safeDiv : int option -> int option -> int option的函數。您需要使用像safeDiv (Some 4) (Some 2)這樣的條目來按原樣使用您的功能。

0

的問題是在(4,2),int * int類型與表達式(_,Some 0)和(Some xx,Some yy)的匹配。全功能可以簡化爲:

let safeDiv x y = 
    match (x,y) with 
    | (_, 0) -> None 
    | (_, _) -> Some (x/y) 

做以下電話有效

safeDiv 4 2