我是Haskell的新手,但直到现在它真的很有趣。目前我正致力于理解类型和类型类
示例:add :: Integer -> Integer -> Integer
。 ->
是正确的关联,这意味着声明类似于Integer -> (Integer -> Integer)
,到目前为止一直很好。但(a->b) -> a -> b
是什么意思?为什么我们突然使用括号?
在我的教科书中,这个声明的例子是带有def的函数apply::(a->b)-> a->b
。 apply f x = f x
。但我不明白,(a->b)
是不是一个单一的功能?
我知道a和b是Typevariables,表明a和b是不同的类型。
答案 0 :(得分:7)
每当您在类型签名中看到括号时,您可以将其视为一个块。因此(a -> b) -> a -> b
与c -> a -> b
相同,其中c
代表a -> b
。 c
恰好是一个本身就是一个函数的类型。
与第一个示例Integer -> (Integer -> Integer)
相同的方式是一个函数,它接受Integer
并返回一个函数Integer -> Integer
;你的函数(a -> b) -> a -> b
是一个函数,它将函数a -> b
和参数a
作为参数,以便返回b
。
对于这个函数apply
,它只是函数应用程序。如果apply
定义为apply f x = f x
,则只需将参数x
传递给函数f
。顺便说一句,这个函数已经存在于Prelude中,并被称为($)
。