3

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

给出的代码是

myId x = x

function n f
 | n > 0 = f . function (n-1) f
 | otherwise = myId

我知道,例如,如果我使用 input 调用函数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

任何人都可以澄清我应该如何“阅读”这个函数以及我应该如何理解类型转换的工作原理(一直在阅读我的 Haskell 文献编程和 Learn You a Haskell 但现在已经循环了几天)。

4

1 回答 1

5

function接受一些数字n和一个函数f :: a -> a,并将该函数与自身n时间组合,返回另一个类型的函数a -> a。当返回的函数应用于类型为 的值时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

这在功能上等同于您的 point-free function

在 Haskell 中,函数f :: a -> b -> c可以解释为“一个接受 anab返回 ac的函数”或“一个接受 ana并返回一个函数 from bto的函数c”。当您将函数应用于一个或多个输入时,请将每个输入视为消除函数的一个参数。在这种情况下,function 10返回一个 type 的新函数(a -> a) -> a -> a,并function 2 (*2)返回一个 type 的函数Num a => a -> a

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

于 2013-05-31T11:25:54.880 回答