当前位置:  开发笔记 > 编程语言 > 正文

Haskell类型签名中括号的含义是什么?

如何解决《Haskell类型签名中括号的含义是什么?》经验,为你挑选了3个好方法。

fmap(Functor方法)的类型签名为例:

(a -> b) -> f a -> f b

与以下类型签名有何不同?

a -> b -> f a -> f b

这两种类型的签名之间是否存在差异?



1> jub0bs..:

是的,是有区别的,因为该->类型的构造函数是右结合.换一种说法,

a -> b -> f a -> f b

相当于

a -> (b -> (f a -> f b))

此类型签名表示一个函数,它接受一个类型的参数a并返回一个函数,该函数本身接受一个类型的参数b并返回一个函数,该函数本身接受一个类型的参数f a并返回一个类型的值f b.

另一方面,

(a -> b) -> f a -> f b

表示一个函数,它接受一个类型的参数a -> b(即一个接受类型参数a并返回一个类型的值的b函数)并返回一个函数,该函数本身接受一个类型的参数f a并返回一个类型的值f b.

这是一个人为的例子,说明了两种类型签名之间的区别:

f :: (Int -> Bool) -> [Int] -> [Bool]
f = map

g :: Int -> Bool -> [Int] -> [Bool]
g n b = map (\n' -> (n' == n) == b)

?> let ns = [42, 13, 42, 17]

?> f (== 42) ns
[True,False,True,False]

?> g 42 True ns
[True,False,True,False]

?> g 42 False ns
[False,True,False,True]



2> Hamish..:

是,

(a -> b) -> ...

意思是"给定一个需要a到b ...的功能".虽然,这个

a -> b -> ...

意思是"给予一些和一些b ......"



3> janneb..:

是的,这(a -> b)意味着一个参数是带签名的函数a -> b,而a -> b -> ...意味着两个参数.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有