Function 从一个旧测试中解释Haskell函数

Function 从一个旧测试中解释Haskell函数,function,haskell,Function,Haskell,我正在复习Haskell编程课程中的一个旧考试,我似乎无法理解这个函数(我认为给出的信息太少了) 给出的代码是 myId x = x function n f | n > 0 = f . function (n-1) f | otherwise = myId 我知道,例如,如果我用输入2(*2)调用函数,我将得到一个函数作为结果。如果我用(-2)(*2)1调用它,我将得到结果1 我只是不知道怎么做?此外,我不能把我的头绕在函数的类型转换上 我知道这两个选项是正确的,但我不明白为什么

我正在复习Haskell编程课程中的一个旧考试,我似乎无法理解这个函数(我认为给出的信息太少了)

给出的代码是

myId x = x

function n f
 | n > 0 = f . function (n-1) f
 | otherwise = myId
我知道,例如,如果我用输入
2(*2)
调用函数,我将得到一个函数作为结果。如果我用
(-2)(*2)1
调用它,我将得到结果
1

我只是不知道怎么做?此外,我不能把我的头绕在函数的类型转换上

我知道这两个选项是正确的,但我不明白为什么(可能是括号让我一时糊涂)


任何人都可以澄清我应该如何“阅读”这个函数,以及我应该如何理解typecast的工作原理(一直在阅读我在Haskell文献中的编程,并从你那里了解到一个Haskell,但现在已经循环了几天)。

函数
需要一些数字
n
和一个函数
f::a->a
,并将该函数与自身组成
n
次,返回另一个
a->a
类型的函数。当返回的函数应用于
a
类型的值时,结果基本上与在循环
n
中执行
f
次相同,使用前一步的输出作为下一步的输入

如果最后一个参数是显式的,可能更容易看到相似性:

function :: (Ord a, Num a) -> a -> (b -> b) -> b -> b
function n f x
  | n > 0     = f (function (n-1) f x)
  | otherwise = x
这在功能上等同于无点
功能

在Haskell中,函数
f::a->b->c
可以解释为“接受
a
b
并返回
c
”或“接受
a
并将函数从
b
返回
c
”的函数。将函数应用于一个或多个输入时,请将每个输入视为删除函数的一个参数。在本例中,
function 10
返回类型为
(a->a)->a->a的新函数,
function 2(*2)
返回类型为
Num a=>a->a的函数


当您这样想时,应该很清楚为什么
函数(-2)(*2)1
返回一个数字而
函数2(*2)
返回一个函数。没有类型铸造正在进行;当您将三个参数
函数
应用于两个输入时,您会得到另一个函数,而不是一个值,因为您没有提供计算该值所需的最终输入。

非常感谢。现在完全明白了(最后点连接起来了:D)你还没有解释为什么第二种类型是正确的:
function :: (Ord a, Num a) -> a -> (b -> b) -> b -> b
function n f x
  | n > 0     = f (function (n-1) f x)
  | otherwise = x