Это функция высшего порядка Хаскелла? - PullRequest
0 голосов
/ 06 февраля 2012

Я хочу знать, является ли сдвиг функцией более высокого порядка или нет.

chartoInt  :: Char -> Int
chartoInt c  =  ord c 

Inttochar  :: Int -> Char
Inttochar  n   =  chr n

shift :: Int -> Char -> Char
shift n c  =  Inttochar  (chartoInt c + n)

Ответы [ 3 ]

5 голосов
/ 06 февраля 2012

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

shift Параметры: n (Int) и c(a Char): также не являются функциями.

(Также: Inttochar должно быть inttochar: имена функций в Haskell не могут начинаться с заглавной буквы.)


Вот функция высшего порядка, которая выглядит как ваша shift:

higherShift :: (Int -> Char) -> Int -> Char -> Char
higherShift f n c = f (chartoInt c + n)

shift = higherShift inttochar   -- same as your original shift

Или, возможно, более полезно:

anotherHigherShift :: (Int -> Int) -> Char -> Char
anotherHigherShift f c = inttochar (f (chartoInt c))

shift n = anotherHigherShift (+n)   -- same as your original shift

Вы можете прочитать сигнатуру типа для anotherHigherShift какчто

  • это функция
  • , первый параметр которой является функцией (эта функция принимает значение Int и возвращает Int)
  • , второй параметр которого равенChar
  • и который возвращает Char

(+n) является сокращением для \m -> m + n.

2 голосов
/ 06 февраля 2012

Существует неформальное правило: взгляните на тип функции. Если он содержит (с необходимостью [1]) фигурные скобки, то это функция более высокого порядка.

[1] В том смысле, что их пропуск меняет тип.

А теперь взгляните на типы ваших функций и функций из первого ответа с этой точки зрения. Это просто.

2 голосов
/ 06 февраля 2012

Это.

Сдвиг является функцией более высокого порядка.

shift :: Int -> (Char -> Char) -- The long prototype.

Он получает Int, а функция возврата получает Char и возвращает Char.

PS Вы должны написать inttochar.

...