我想知道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)
答案 0 :(得分:5)
这些函数都不是高阶函数,因为这些函数都不会将函数作为参数。
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
的缩写。
答案 1 :(得分:2)
是。
转变是一种更高阶的功能。
shift :: Int -> (Char -> Char) -- The long prototype.
得到Int
并返回获取Char
并返回Char
的函数。
P.S。
你应该写inttochar
。
答案 2 :(得分:2)
有非正式规则:看一下功能的类型。如果它包含(有必要[1])括号,那么它就是一个更高阶函数。
[1]意思是省略它们会改变类型。
现在从这个角度来看第一个答案,看看你的功能和功能的类型。这很简单。