2013-03-01 51 views
3

我真的被Haskell中的函数类型困住了。有两种功能的类型,我不能解释这些之间的真正区别。类似的括号化函数类型之间的区别

a :: Int -> (Int -> (Int -> (Int -> Int))) 

b :: (((Int -> Int) -> Int) -> Int) -> Int 

我还是不明白这一点。我知道currying的目的是什么 - 但我看不出在这个例子中卷曲的概念!

函数a:传入一个Int,结果是另一个需要Int ...等等。

功能b:这与功能A有什么不同?

回答

7

也许是做的最好的事情就是想约两简单的功能:

f :: a -> (b -> c) 
g :: (a -> b) -> c 

让我们来看看这些功能反过来。

第一个函数f采用类型为a的单个参数,并返回类型为b -> c的函数。换句话说,你可以写类似于以下,假设x :: ay :: b,并z :: c

f :: a -> (b -> c) 
f x = f' 
    where f' :: b -> C 
     f' y = z 

另一种方式来写的f签名是:

f :: a -> b -> c 

这在默认情况下工作,因为我们将->绑定到右侧。它也给了我们另一种理解f的等效方式:它可以被认为是一个函数,它带有两个参数,类型为ab,并产生c类型的结果。

第二个函数g带有一个参数,它是类型为a -> b的函数。

g :: (a -> b) -> c 
g h = z 
    where h :: a -> b 

因此这两者是非常不同的。

将此应用于您的函数,第一个函数需要4个值类型为Int并返回Int。第二个函数采用类型为((Int -> Int) -> Int) -> Int的单个函数,并且这是一个函数,其采用类型为(Int -> Int)的第三个函数,并生成Int,依此类推。

3

函数b将函数作为参数 - 它不会生成函数作为其结果。这是一个很大的区别:

a 42将产生一个函数,其他参数。 b 42将产生类型错误,因为42不是函数。 b myfun其中myfun有类型((Int -> Int) -> Int) -> Int)将产生一个Inta myfun将导致类型错误,因为myfun不是整数。

相关问题