Haskell - 斗争理解类型
Haskell - Struggle understanding types
我是 Haskell 的新手,但到现在为止真的很有趣。目前我正在努力理解类型和类型 类
示例:add :: Integer -> Integer -> Integer
。 ->
是右结合的,这意味着声明类似于 Integer -> (Integer -> Integer)
,到目前为止还不错。但是 (a->b) -> a -> b
是什么意思呢?为什么我们突然使用括号?
在我的教科书中,有一个带有函数 apply::(a->b)-> a->b
和 def 的声明示例。 apply f x = f x
。但是我不明白,(a->b)
不是一个函数吗?
我知道a和b是类型变量,表示a和b是不同的类型。
只要在类型签名中看到括号,就可以将其视为一个块。所以 (a -> b) -> a -> b
与 c -> a -> b
相同,其中 c
代表 a -> b
。 c
恰好是一个类型,它本身就是一个函数。
与您的第一个示例相同,Integer -> (Integer -> Integer)
是一个接受 Integer
的函数,而 return 是一个函数 Integer -> Integer
;您的函数 (a -> b) -> a -> b
是一个将函数 a -> b
和参数 a
作为参数的函数,以便 return a b
.
在这个函数的情况下apply
它只是简单的函数应用。如果 apply
定义为 apply f x = f x
,它只是将参数 x
传递给函数 f
。顺便说一句,这个函数已经存在于Prelude中,叫做($)
.
我是 Haskell 的新手,但到现在为止真的很有趣。目前我正在努力理解类型和类型 类
示例:add :: Integer -> Integer -> Integer
。 ->
是右结合的,这意味着声明类似于 Integer -> (Integer -> Integer)
,到目前为止还不错。但是 (a->b) -> a -> b
是什么意思呢?为什么我们突然使用括号?
在我的教科书中,有一个带有函数 apply::(a->b)-> a->b
和 def 的声明示例。 apply f x = f x
。但是我不明白,(a->b)
不是一个函数吗?
我知道a和b是类型变量,表示a和b是不同的类型。
只要在类型签名中看到括号,就可以将其视为一个块。所以 (a -> b) -> a -> b
与 c -> a -> b
相同,其中 c
代表 a -> b
。 c
恰好是一个类型,它本身就是一个函数。
与您的第一个示例相同,Integer -> (Integer -> Integer)
是一个接受 Integer
的函数,而 return 是一个函数 Integer -> Integer
;您的函数 (a -> b) -> a -> b
是一个将函数 a -> b
和参数 a
作为参数的函数,以便 return a b
.
在这个函数的情况下apply
它只是简单的函数应用。如果 apply
定义为 apply f x = f x
,它只是将参数 x
传递给函数 f
。顺便说一句,这个函数已经存在于Prelude中,叫做($)
.