2013-05-31 108 views
3

我在回顾我的Haskell编程课程中的一个旧考试,我似乎无法将我的头围绕此函数(我认为这里给出的信息太少)。旧考试中Haskell功能的解释

给出的代码是

myId x = x 

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

我知道,如果我例如调用该函数与输入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文学和学习你Haskell的,但在圈已经持续了几天)。

回答

5

function需要一些号码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 

这是功能上等同于function免费的点。

在Haskell,函数f :: a -> b -> c可以被解释为任一或“的函数,它接受一个a并返回一个函数从bc”,“接受一个ab并返回一个c一个函数”。将函数应用于一个或多个输入时,将每个输入视为消除函数参数中的一个。在这种情况下,function 10返回类型为(a -> a) -> a -> a的新函数,function 2 (*2)返回类型为Num a => a -> a的函数。

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

+1

非常感谢。完全得到它(最后点连接:D) – Anticipating

+0

你没有解释为什么第二种类型是正确的。 :) –