Проверка аргументов 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#!