2015-02-15 2 views
0

У меня возникли проблемы с пониманием, как работает это объявление типа.Понимание этого типа в Haskell?

Тип является: (a -> b) -> (b -> c) -> (c -> d) -> a -> d

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

Итак, это то, как я делаю свою функцию:

Example :: (a -> b) -> (b -> c) -> (c -> d) -> a -> d 
Example f g h x = f (g (h (x)) 

Я бы очень признателен, если вы, ребята могли бы мне помочь прояснить. Спасибо!

+0

Он также принимает 'a' (последний« параметр »). Это своего рода функции, называемые «состав функций». Я настоятельно рекомендую вам устроиться с оператором '(.)', Который сделает именно это, и как только вы это сделаете, и пусть идея погрузится, это будет кусок пирога. – MasterMastic

+4

Это в обратном порядке, должно быть «Пример f g h x = h (g (f (x))). –

+0

@AmitKumarGupta Может быть, автору нравится конвейер (например, в F #): P, если это действительно так. – MasterMastic

ответ

1

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

Когда вы читаете что-то вроде (a -> b) внутри типа, это функция, как вы сказали. Например (Int -> Bool) - это функция.

Давайте сделаем пример:

even :: Int -> Bool -- A more generic version of that is in the Prelude 
even n = n `rem` 2 == 0 

filter :: (Int -> Bool) -> [Int] -> [Int] -- And of that, too 
filter _ [] = [] 
filter f (x:xs) 
    | f x  = x : filter f xs 
    | otherwise = filter f xs 

filteredEven :: [Int] 
filteredEven = filter even [1..5] -- it gives [2, 4] 

В этом примере мы имеем функцию «высокого порядка», функцию, которая получит другую функцию и использовать его в некотором роде.

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

Каждая функция, которую вы объявляете в типе, принимает значение, возвращенное из предыдущего. Таким образом, возможно решение, которое вы уже показали. Но типы носят общий характер. Существует не полная функция, которая возвращает общее значение (где total означает, что он заканчивается, всегда возвращает значение, отличное от дна, если все значения являются тотальными и разными по снизу, поэтому он не разбивается или не возвращается, например, неопределенным). Итак, если вам нужна полная функция, у вас должен быть способ генерации запрошенных переменных, из контекста функции (их параметров).

В предыдущем примере, используя имена, используемые вами, вы должны вернуть значение типа d. У вас есть только способ получить значение этого типа - функцию h. Но для использования функции h вам нужно получить значение типа c. Для этого у вас есть только функция g. Но вам нужно значение типа c. К счастью, у вас есть функция f, которая взамен значения типа a возвращает требуемое значение. У нас есть это значение (и у нас нет другого способа получить значение этого типа), поэтому функция может быть записана. Мы никоим образом не можем изменить полученные значения (вызовите несколько раз, когда функции не работают, для чистоты и того факта, что у нас есть только способ создания значений), так что это единственный способ построить функцию, если мы хотим быть всего:

Example (a -> b) -> (b -> c) -> (c -> d) -> a -> d 
Example f g h x = h (g (f x))) 

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

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