2014-10-26 2 views
1

Я изучаю некоторые haskell с этих выходных, я нашел этот язык интересным, но и некоторые синтаксисы заставляют меня смущаться.haskell function invoke order

Вроде, zip - это функция, которая принимает 2 списка в качестве параметров, а затем возвращает список пар. если я вызываю zip [1,2,3] [3,2,1] в ghci Я получил [(1,3),(2,2),(3,1)]. Но если я скажу (zip [1,2,3]) [3,2,1], он возвращает тот же результат.

Когда я посмотрел в определение функции почтового индекса, используя :i zip, я получил zip :: [a] -> [b] -> [(a, b)] -- Defined in ‘GHC.List’, от этого, кажется, что zip функция применяется первый Parmeter, возвращает функцию, а затем применить ко второму параметру.

Другим примером является elem, elem 1 [1,2,3], (elem 1) [1,2,3] и (1 `elem`) [1,2,3] вернуть тот же результат.

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

+0

Вы можете прочитать 'SomeFunc :: а -> Ь -> с 'как' someFunc :: a -> (b -> c) ', что может помочь вам самому ответить на вопрос. – Zeta

+2

см. Также: http://stackoverflow.com/questions/1352855/in-functional-programming-what-is-currying – kieran

ответ

5

(->) прав associative¹, а это значит, что-то вроде этого:

zip :: [a] -> [b] -> [(a, b)] 

понимается GHC как:

zip :: [a] -> ([b] -> [(a, b)]) 

Последнее помогает вам увидеть, что при вызове zip с одним аргумент, вы получаете функцию назад:

λ> :t zip [1, 2, 3] 
zip [1, 2, 3] :: Num a => [b] -> [(a, b)] 

Th называется currying или частичным приложением.


Примечания

  1. правой ассоциативно означает, что группы операторов вправо. Общим примером является оператор питания ^. В башне питания, это очевидно: λ> 2^2^2^2 65536 λ> 2^(2^(2^2)) 65536

    Если оператор питания были левоассоциативной, мы имеем: λ> ((2^2)^2)^2 256

+0

Большое вам спасибо, я думал, что нашел что-то большое, но, оказывается, это общая идея в haskell. Я продолжу погружаться в него. – xcaptain

+1

Я рад, что это было полезно. Да, каррирование распространено и супер-полезно! Вы можете подумать о принятии ответа, если он ответит на ваши вопросы. – rubik

+0

Извините, я просто понял, что должен принять удовлетворенный ответ. – xcaptain