Haskell - 斗争理解类型

时间:2017-05-21 13:18:39

标签: haskell types higher-order-functions

我是Haskell的新手,但直到现在它真的很有趣。目前我正致力于理解类型和类型类

示例:add :: Integer -> Integer -> Integer->是正确的关联,这意味着声明类似于Integer -> (Integer -> Integer),到目前为止一直很好。但(a->b) -> a -> b是什么意思?为什么我们突然使用括号? 在我的教科书中,这个声明的例子是带有def的函数apply::(a->b)-> a->bapply f x = f x。但我不明白,(a->b)是不是一个单一的功能?

我知道a和b是Typevariables,表明a和b是不同的类型。

1 个答案:

答案 0 :(得分:7)

每当您在类型签名中看到括号时,您可以将其视为一个块。因此(a -> b) -> a -> bc -> a -> b相同,其中c代表a -> bc恰好是一个本身就是一个函数的类型。

与第一个示例Integer -> (Integer -> Integer)相同的方式是一个函数,它接受Integer并返回一个函数Integer -> Integer;你的函数(a -> b) -> a -> b是一个函数,它将函数a -> b和参数a作为参数,以便返回b

对于这个函数apply,它只是函数应用程序。如果apply定义为apply f x = f x,则只需将参数x传递给函数f。顺便说一句,这个函数已经存在于Prelude中,并被称为($)