Приятная вещь в таких языках, как Haskell (она очень похожа на F #, но я не знаю точного синтаксиса - это должно помочь вам понять ->, хотя) заключается в том, что вы можете применять только части аргумента , чтобы создать кэрри функции:
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
Как вы помните, гадюка принимает INT, в INT, в INT, и дает вам обратно в Int. Однако это не вся правда, как вы вскоре увидите. На самом деле, add5 будет иметь этот тип:
add5 :: Int -> Int -> Int
Это будет, как если бы вы «отслаивается» из целых чисел (самый левый), и приклеить его непосредственно к функции. Приглядевшись в подписи функции, мы замечаем, что -> являются правоассоциативной, то есть:
addder :: Int -> (Int -> (Int -> Int))
Это должно сделать это совершенно ясно: когда вы даете сумматор первое целое число, оно будет вычисляться независимо это к право первой стрелки, или:
add5andtwomore :: Int -> (Int -> Int)
add5andtwomore = adder 5
Теперь вы можете использовать add5andtwomore вместо «сумматора 5». Таким образом, вы можете использовать другое число, чтобы получить (например) «add5and7andonemore»:
add5and7andonemore :: Int -> Int
add5and7andonemore = adder 5 7
Как вы видите, add5and7andonemore хочет точно еще один аргумент, и, когда вы даете ему, то он внезапно стал целым!
> add5and7andonemore 9
=> ((add5andtwomore) 7) 9
=> ((adder 5) 7) 9)
<=> adder 5 7 9
Подставляя параметры в сумматоре (NXY) для (5 7 9), получим:
> adder 5 7 9 = 5 + 7 + 9
=> 5 + 7 + 9
=> 21
На самом деле, плюс также просто функция, которая принимает Int и дает вам назад еще один int, так что выше это действительно больше похоже:
> 5 + 7 + 9
=> (+ 5 (+ 7 9))
=> (+ 5 16)
=> 21
Там вы идете!
Все это действительно кажется мне греческим. – Brettski 2008-09-19 19:24:33
Просто назовите его Мафусалой. – 2008-09-19 19:40:16
На самом деле Мафусаил жил в течение 969 лет, поэтому я все равно остался бы на треть от его возраста. Тем не менее, отредактировано спасибо;) – AnthonyWJones 2008-09-20 20:01:22