1

以下の点で困っています。

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)か?これもうまくいかない…

4

4 に答える 4

4

わかりました、これはやり過ぎですが、実際に最近これに似たことをしました。

最初に、オプション タイプの計算式ビルダーを定義しました。

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 }

ウィキブックで計算式の詳細を読むことができます: http://en.wikibooks.org/wiki/F_Sharp_Programming/Computation_Expressions

この背後にある理論を深く掘り下げたい場合は、Tomas Petricek と Don Syme によるこの論文を読むことができます: http://www.cl.cam.ac.uk/~tp322/drafts/notations.pdf

于 2013-10-08T10:52:48.657 に答える
0

問題は、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
于 2016-04-18T11:28:28.317 に答える