这是Haskell的高阶函数吗?

时间:2012-02-06 09:45:26

标签: haskell higher-order-functions

我想知道shift是否是更高阶函数。

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 个答案:

答案 0 :(得分:5)

这些函数都不是高阶函数,因为这些函数都不会将函数作为参数。

shift的参数为nInt)和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的缩写。

答案 1 :(得分:2)

是。

转变是一种更高阶的功能。

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

得到Int并返回获取Char并返回Char的函数。

P.S。 你应该写inttochar

答案 2 :(得分:2)

有非正式规则:看一下功能的类型。如果它包含(有必要[1])括号,那么它就是一个更高阶函数。

[1]意思是省略它们会改变类型。

现在从这个角度来看第一个答案,看看你的功能和功能的类型。这很简单。