Проверка аргументов F#

В F# есть несколько хороших функций проверки аргументов succint, которые можно использовать так:

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#; или, другими словами, есть ли рабочая реализация для nonNull в F#?

Это не похоже на меня, но, возможно, кто-то здесь может это проверить.

1 ответ

Решение

Как отметил @svick в комментариях, в настоящее время это не будет работать очень хорошо, потому что <@ bar @> будет фактически представлен как 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#!

Другие вопросы по тегам