F # обрабатывает ли сопоставление параметров по-разному, когда есть только один входной параметр? - PullRequest
2 голосов
/ 06 июня 2011

Функция соответствия основана на определении файла в F #:

let f2 x y = x + y
let value5 = f2 10 20
let value = f2(10, 20) <-- Error

let f3 (x, y) = x + y
let value6 = f3(10, 20)
let value = f3 10 20 <-- Error

Однако я могу использовать оба способа с одним параметром с помощью F #:

let f n = n + 10
let value3 = f 10
let value4 = f(10)

Почему это? F # обрабатывает ли сопоставление параметров по-разному, когда есть только один входной параметр?

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Как правильно объясняет Ашайс, два способа объявления функций различны.Вы можете увидеть это, посмотрев на сигнатуру типа.Вот интерактивный сеанс F #:

> let f1 (x, y) = x + y;;  
val f1 : int * int -> int

> let f2 x y = x + y;;
val f2 : int -> int -> int

Первая функция принимает кортеж типа int * int и возвращает int.При его вызове вам необходимо указать кортеж (который является просто одним значением):

// Using tuple directly as the argument
f1 (1, 2)

// .. or by declaring tuple value first
let tup = (1, 2)
f1 tup

Тип второй функции - int -> int -> int, что совпадает с int -> (int -> int).Это означает, что это функция, которая принимает int и возвращает функцию, которая принимает int и возвращает int.Эта форма называется curry форма, и она позволяет вам использовать частичное применение функции , как продемонстрировано Ashays.На самом деле, звонок:

f2 1 2

// Could be written as:
(f2 1) 2
1 голос
/ 06 июня 2011

Я подозреваю, что это как-то связано с кортежами и карри. По сути, кортеж из одного предмета снова становится единичным, однако в двух других наших случаях мы имеем следующее:

Первый случай (f2) на самом деле является функцией, которая принимает одно значение (x) и возвращает значение, которое принимает еще одну единственную функцию. Здесь мы можем увидеть использование карри от f2 до add10

let add10 = f2 10     
let myVal = add10 20

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

Еще раз, в последнем случае, у нас есть кортеж из одного предмета, и поэтому f x и f(x) фактически одно и то же.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...