Хорошая вещь в таких языках, как Haskell (в F # она очень похожа, но я не знаю точного синтаксиса - это должно помочь вам понять ->, хотя) в том, что вы можете применять только части аргумента, для создания curry функций:
adder n x y = n + x + y
Другими словами: «дай мне три вещи, и я сложу их вместе». Когда вы кидаете числа в него, компилятор выводит типы n x и y. Скажи, что пишешь
adder 1 2 3
Тип 1, 2 и 3 - Int. Поэтому:
adder :: Int -> Int -> Int -> Int
То есть, дайте мне три целых числа, и я, в конце концов, стану целым числом или то же самое, что и сказать:
five :: Int
five = 5
Но вот хорошая часть! Попробуйте это:
add5 = adder 5
Как вы помните, adder принимает int, int, int и возвращает вам int. Однако это не вся правда, как вы скоро увидите. Фактически, add5 будет иметь такой тип:
add5 :: Int -> Int -> Int
Это будет, как если бы вы "отцепили" целые числа (крайние слева) и приклеили их непосредственно к функции. Если присмотреться к сигнатуре функции, мы заметим, что -> являются ассоциативными справа, т. Е .:
addder :: Int -> (Int -> (Int -> Int))
Это должно прояснить это: когда вы дадите сумматору первое целое число, оно будет оцениваться с тем, что находится справа от первой стрелки, или:
add5andtwomore :: Int -> (Int -> Int)
add5andtwomore = adder 5
Теперь вы можете использовать add5andtwomore вместо "adder 5". Таким образом, вы можете применить другое целое число, чтобы получить (скажем) «add5and7andonemore»:
add5and7andonemore :: Int -> Int
add5and7andonemore = adder 5 7
Как видите, add5and7andone больше хочет точно другой аргумент, и когда вы его дадите, он внезапно станет целым числом!
> add5and7andonemore 9
=> ((add5andtwomore) 7) 9
=> ((adder 5) 7) 9)
<=> adder 5 7 9
Подставляя параметры к сумматору (n x y) для (5 7 9), получаем:
> adder 5 7 9 = 5 + 7 + 9
=> 5 + 7 + 9
=> 21
На самом деле , плюс также является просто функцией, которая принимает целое число и возвращает вам другое целое число, так что вышеприведенное действительно больше похоже на:
> 5 + 7 + 9
=> (+ 5 (+ 7 9))
=> (+ 5 16)
=> 21
Вот, пожалуйста!