从旧考试中解释Haskell函数

Ant*_*ing 3 haskell function

我正在审查我的Haskell编程课程中的旧考试,我似乎无法围绕这个功能(我认为给出的信息太少).

给出的代码是

myId x = x

function n f
 | n > 0 = f . function (n-1) f
 | otherwise = myId
Run Code Online (Sandbox Code Playgroud)

我知道如果我例如用输入调用函数2 (*2),我将得到一个函数作为结果.如果我打电话给我,(-2) (*2) 1我会得到结果1.

我只是不知道怎么样?另外,我无法绕过函数的类型.

我知道这两个选项是正确的,但我不明白为什么(可能是括号让我感到困惑).

function :: (Num a, Ord a) => a -> (a -> a) -> a -> a
function :: (Num a, Ord b) => a -> (b -> b) -> b -> b
Run Code Online (Sandbox Code Playgroud)

任何人都可以澄清我应该如何"阅读"这个功能,以及我应该如何理解类型转换是如何工作的(已经阅读了我在Haskell文献中的编程以及从了解你的Haskell,但现在已经进入了几天).

val*_*man 5

function取一些数字n和一个函数f :: a -> a,并用自己的n时间组合该函数,返回另一个类型的函数a -> a.当返回的函数应用于type的值时a,结果与f在循环n时间中执行的结果基本相同,使用每个前一步骤的输出作为下一步的输入.

如果最终参数是明确的,也许更容易看到相似性:

function :: (Ord a, Num a) -> a -> (b -> b) -> b -> b
function n f x
  | n > 0     = f (function (n-1) f x)
  | otherwise = x
Run Code Online (Sandbox Code Playgroud)

这在功能上等同于你的无点function.

在Haskell中,函数f :: a -> b -> c可以被解释为"一个带aa bca的函数并返回一个"或"一个函数,它接受a一个函数并将函数返回bc".将函数应用于一个或多个输入时,请将每个输入视为消除函数的一个参数.在这个例子中,function 10返回一个带有type的新函数(a -> a) -> a -> a,并function 2 (*2)返回一个带有type的函数Num a => a -> a.

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