4

F# には、次のように使用できる簡潔な引数チェック関数がいくつかあります。

let foo (bar : string) : string =
    if bar = null then
        nullArg "bar"
    ...

私はより規範的な表現を好みますが、コード コントラクトのように:

let foo (bar : string) : string =
    Contract.Requires (bar <> null, "bar is null")
...

ただし、私が書きたいと思っているコードは次のとおりです。

let nonNull (expr : Expr) : unit =
    // quotation magic

let foo (bar : string) : string =
    nonNull <@ bar @>
    ...

問題は、これを F# で表現できるかどうかです。または別の言い方をすれば、F# で nonNull の実用的な実装はありますか?

私にはそう見えませんが、おそらくここの誰かがそれを確認できます。

4

1 に答える 1

4

<@ bar @>コメントで@svickが述べたように、実際には として表されるため、これは現在うまく機能しませんValue(null, typeof<string>)。そのため、値がnullであるかどうかを確認できますが、現在、パラメーターの名前を取得することはできません。

できる部分は次のようになります。

open Microsoft.FSharp.Quotations

let nonNull (expr : Expr) =
  match expr with 
  | Patterns.Value(null, _) -> failwith "it is null"
  | _ -> ()

ただし、これは次のバージョンで改善される可能性があります:-) このF# 機能の要求には、引用符で変数の名前を表す機能が必要です。したがって、おそらく次のバージョンの F# で確認してください!

于 2014-07-13T18:55:30.800 に答える