Введение. Я думаю, что сначала полезно обсудить разницу в простом примере, поскольку это помогает понять, что такое "единичное" значение.Первое объявление создает строковое значение (и немедленно вызывает ReadLine
для получения ввода от пользователя):
> let readLine = Console.ReadLine ();;
val readLine : string
Второе объявление создает функцию, которая принимает значение единицы в качестве аргумента.Функция не должна принимать никаких входных данных, но мы хотим определить ее как функцию, чтобы ее можно было выполнять многократно (нам нужно это, потому что функция имеет побочный эффект - она считывает вводот пользователя).
Параметр «unit» - это просто способ создания функции, которая принимает что-то в качестве аргумента.«Единица» имеет только одно значение, записанное как ()
, поэтому оно не представляет никакой информации - только тот факт, что есть некоторый параметр:
> let readLine () = Console.ReadLine ();;
val readLine : unit -> string
Ваш вопрос. Чтобы посмотреть на ваш пример с дополнительными скобками.Это создает функцию, которая принимает строку в качестве первого параметра и принимает дополнительное значение «единицы» в качестве второго параметра.Это видно из сигнатуры типа:
> let print (text : string) () = Console.WriteLine text
val print : string -> unit -> unit
Это допустимое объявление F #, но оно не очень полезно.Это означает, что функция будет вызываться только тогда, когда вы дадите ей строку для печати, а также дополнительное значение «unit».Вы можете назвать это так:
print "Hello" ()
Даже без дополнительного параметра «unit», это будет функция (в отличие от значения), поэтому добавление дополнительного параметра не поможет (вымы всегда создаем функцию, которую можно вызывать для печати разных строк).
Есть еще случаи, когда это объявление может быть интересным.Например, вы можете вызвать функцию только со строкой в качестве параметра.В этом случае вы получите функцию в результате.Возвращенная функция примет единицу и напечатает строку:
let f = print "Hello" // doesn't print anything
f () // prints "Hello"
f () // prints "Hello" again!
Итак, компилятор позволяет использовать значения «единицы» как любые другие значения в языке.Это включает использование, которое на первый взгляд может показаться немного незнакомым (и не очень полезным), но может иметь смысл в некотором сценарии.