Если карта или фильтр используются внутри другой функции, становится ли эта функция более высокого порядка? - PullRequest
1 голос
/ 08 февраля 2012

Если я использую карту или фильтр внутри другой функции, становится ли эта функция функцией более высокого порядка? Например:

removeSpaces :: String -> String 
removeSpaces xs = filter (not . isSpace) xs 

Является ли removeSpaces функцией высшего порядка?

Ответы [ 4 ]

6 голосов
/ 08 февраля 2012

Нет, removeSpaces не является функцией высшего порядка.

Функция высшего порядка - это функция, принимающая функцию в качестве аргумента. removeSpaces нет, так что нет.

Более высокий порядок - это свойство интерфейса функции, а не его реализации, поэтому мы можем сказать, что removeSpaces не является более высоким порядком, просто взглянув на его тип: он не принимает никаких функций в качестве аргументов, поэтому это не высший порядок. Он реализован с использованием функции более высокого порядка, но это совсем другое дело.

Например, filter - функция высшего порядка, потому что она объявлена ​​как функция, принимающая в качестве параметра:

filter :: (a -> Bool) -> [a] -> [a]

Но concat нет, потому что в качестве аргументов нет типов функций (a -> b):

concat :: [[a]] -> [a]

Полиморфизм представляет собой сложный крайний случай: вы можете передать функцию в id - id concat [[1, 2], [3, 4]] is [1, 2, 3, 4] - но ее тип не объявляет ее как принимающую какие-либо функции в качестве аргументов:

id :: a -> a

В этом случае id - это , а не высшего порядка. Функция должна явно иметь аргумент функции в своем типе, чтобы иметь более высокий порядок.

3 голосов
/ 08 февраля 2012

Нет.Функция более высокого порядка - это функция, которая принимает в качестве параметра другую функцию.

Правило большого пальца: если подпись типа содержит стрелку в скобках, а эти скобки не находятся в конце подписи типа,как это: (... -> ...) -> ..., затем функция более высокого порядка.

0 голосов
/ 08 февраля 2012

Не обязательно и не в вашем примере.

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

Ваша removeSpaces функция не выполняет ни одной.

0 голосов
/ 08 февраля 2012

Нет, функция высшего порядка использует функцию в качестве аргумента, например, map.

...