我正在审查我的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,但现在已经进入了几天).
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 b和ca的函数并返回一个"或"一个函数,它接受a一个函数并将函数返回b到c".将函数应用于一个或多个输入时,请将每个输入视为消除函数的一个参数.在这个例子中,function 10返回一个带有type的新函数(a -> a) -> a -> a,并function 2 (*2)返回一个带有type的函数Num a => a -> a.
当你以这种方式想到它时,应该清楚为什么function (-2) (*2) 1在function 2 (*2)返回函数时返回一个数字.没有类型铸造正在进行; 当您将三个参数function应用于两个输入时,您将获得另一个函数而不是值,因为您没有提供计算该值所需的最终输入.