簡體   English   中英

Int選項而不是F#中的Int

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM