Как я могу избежать случайного частичного применения компактным способом? - PullRequest
2 голосов
/ 29 января 2020

У меня есть побочная функция, f : int -> string -> unit, которую я вызываю с помощью f 1 "hi".

Чтобы убедиться, что я получаю сообщение об ошибке на сайте вызова, если функция изменяется, чтобы потребовать больше аргументов, Я вызываю функцию, используя () = f 1 "hi" |> ignore. Это обеспечит ошибку типа, если функция будет применена частично и побочные эффекты не будут выполнены.

Есть ли более элегантный способ избежать случайного частичного применения?

Ответы [ 3 ]

4 голосов
/ 29 января 2020

Добавить параметр «guard» в самом конце:

let f a b c () = ...

и передать его на сайт вызова:

f 42 "foo" 3.14 ()

Если вы добавите другой параметр, его тип не будет сопоставьте unit (если вы не добавляете параметр unit, но зачем вам это делать?), и компилятор будет жаловаться на сайт вызова.

Дополнительный параметр unit является обычным способом. обозначения функции, которая только побочный эффект.

Для чистых функций, с другой стороны, этот трюк не нужен, так как вы были бы заинтересованы в их возвращаемом значении, и случайное частичное применение изменило бы тип этого, вызвав жалобу компилятора.

3 голосов
/ 29 января 2020

Предупреждение, которое вы получаете от компилятора: FS0193: «Это выражение является значением функции, т. Е. Отсутствуют аргументы».

В Visual Studio в свойствах проекта в разделе Обрабатывать предупреждения как ошибки, Specifi c предупреждений, добавьте 0193. Используйте точку с запятой в качестве разделителя, если необходимо.

Я не понимаю, как это может быть более элегантно, чем эта. Исходный код будет выглядеть так, как и ожидалось, без каких-либо дополнительных загадок, но компиляция не удастся, если вы измените функцию без настройки сайта вызова. На самом деле я не понимаю, почему это предупреждение не является ошибкой по умолчанию.

Если вы не используете VS, отредактируйте настройки вручную в файле проекта, как объяснено здесь .

1 голос
/ 29 января 2020

Я бы добавил просто аннотацию типа

f 1 "hi" : unit

Вот и все.

...