2013-03-01 3 views
3

Я действительно придерживаюсь типов функций в Haskell. Существуют типы двух функций, и я не могу объяснить, какова реальная разница между ними.Разница между аналогичными типами функций в скобках

a :: Int -> (Int -> (Int -> (Int -> Int))) 

b :: (((Int -> Int) -> Int) -> Int) -> Int 

Я до сих пор не понимаю смысла. Я знаю, какова цель каррирования, но я не вижу в этом примере концепции карри!

функция a: передается Int, а результат - другой, который принимает Int ... и так далее.

Функция b: Как это отличается от функции A?

ответ

7

Пожалуй, лучше всего сделать, это думать о двух простых функций:

f :: a -> (b -> c) 
g :: (a -> b) -> c 

Давайте посмотрим на эти функции, в свою очередь.

Первая функция, f, принимает один параметр типа a и возвращает функцию типа b -> c. Другими словами, вы могли бы написать что-то вроде следующего, предполагая x :: a, y :: b и z :: c:

f :: a -> (b -> c) 
f x = f' 
    where f' :: b -> C 
     f' y = z 

Другой способ, чтобы написать подпись f как:

f :: a -> b -> c 

Это работает, потому что по умолчанию мы связываем -> направо. Это также дает нам еще один эквивалентный способ понимания: f: можно подумать о функции, которая принимает два параметра типа a и b и производит результат типа c.

Вторая функция, g принимает один аргумент, который является функцией типа a -> b.

g :: (a -> b) -> c 
g h = z 
    where h :: a -> b 

Таким образом, они отличаются друг от друга.

Применяя это к вашим функциям, первая функция принимает 4 значения типа Int и возвращает Int. Вторая функция принимает единственную функцию типа ((Int -> Int) -> Int) -> Int, и это функция, которая выполняет третью функцию типа (Int -> Int) и производит Int и т. Д.

3

Функция b принимает функцию в качестве аргумента - она ​​не производит функцию в качестве ее результата. Это большая разница:

a 42 будет производить функцию, которая принимает дополнительные аргументы. b 42 приведет к ошибке типа, потому что 42 не является функцией. b myfun, где myfun имеет тип ((Int -> Int) -> Int) -> Int) будет производить Int. a myfun вызовет ошибку типа, потому что myfun не является целым числом.

Смежные вопросы