Tor*_*röm 3 haskell types function currying
我真的陷入了Haskell中的函数类型.给出了两种函数的类型,我无法解释它们之间的真正区别.
a :: Int -> (Int -> (Int -> (Int -> Int)))
b :: (((Int -> Int) -> Int) -> Int) -> Int
Run Code Online (Sandbox Code Playgroud)
我仍然不明白这一点.我知道currying的目的是什么 - 但我在这个例子中看不到currying的概念!
函数a:Int传入一个,结果是另一个传递Int...等等.
功能b:这与功能A有什么不同?
也许最好的办法是考虑两个更简单的功能:
f :: a -> (b -> c)
g :: (a -> b) -> c
Run Code Online (Sandbox Code Playgroud)
让我们依次看看这些功能.
第一个函数f采用类型的单个参数a,并返回类型的函数b -> c.换句话说,你可以写类似下面的假设x :: a,y :: b以及z :: c:
f :: a -> (b -> c)
f x = f'
where f' :: b -> C
f' y = z
Run Code Online (Sandbox Code Playgroud)
写签名的另一种方法f是:
f :: a -> b -> c
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为默认情况下我们绑定->到右边.它还为我们提供了另一种等效的理解方式f:它可以被认为是一个带有两个参数的函数,类型a和b,并产生类型的结果c.
第二个函数g接受一个参数,它是类型的函数a -> b.
g :: (a -> b) -> c
g h = z
where h :: a -> b
Run Code Online (Sandbox Code Playgroud)
因此两者非常不同.
将此函数应用于您的函数,第一个函数采用4个类型的值Int并返回一个Int.第二个函数采用类型的单个函数((Int -> Int) -> Int) -> Int,这是一个函数,它接受类型的第三个函数(Int -> Int)并生成一个Int,依此类推.