![](/img/trans.png)
[英]F# Continuation Passing Style (int -> int -> int) option
[英]Int Option instead of Int in 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的選項。
難道我是要使用safeDiv
Some(4)
Some(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類型的功能子-> float-> float選項
let sub x y = if y = 0.0 then None else Some (x / y)
最后我使用OptionBuilder將saveDiv定義為float選項-> float選項-> float選項
let safeDiv x y = opt { let! a = x
let! b = y
return! sub a b }
您可以在Wikibooks上閱讀有關計算表達式的更多信息: http : //en.wikibooks.org/wiki/F_Sharp_Programming/Computation_Expressions
如果您想深入了解其背后的理論,可以閱讀Tomas Petricek和Don Syme撰寫的這篇論文: http ://www.cl.cam.ac.uk/~tp322/drafts/notations.pdf
您的第二個版本已經關閉。
它應該是
safeDiv (Some(4)) (Some(2))
需要使用額外的括號來確保按正確的順序應用功能。
您構造了一個具有簽名safeDiv : int option -> int option -> int option
的函數safeDiv : int option -> int option -> int option
。 您需要使用諸如safeDiv (Some 4) (Some 2)
類的條目來按safeDiv (Some 4) (Some 2)
使用您的功能。
問題在於int * int類型的(4,2)與表達式(_,Some 0)和(Some xx,Some yy)的匹配。 整個功能可以簡化:
let safeDiv x y =
match (x,y) with
| (_, 0) -> None
| (_, _) -> Some (x/y)
使以下通話有效
safeDiv 4 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.