回答
这个签名包含->
的事实告诉我们这是一个函数。无论在最后一次->
之后发生的是函数的返回类型,一旦完全应用。我们来看看各个部分。
(a -> b)
这是第一个参数,它也是一个函数。这意味着map
是一个高阶函数 - 它将函数作为其参数之一。 a -> b
本身是一种将a
类型的某些值转换为b
类型的某个值的功能。
[a]
第二个参数。方括号是表示列表的特殊语法。因此,这个论点是一个包含a
类型元素的列表。
[b]
结果的类型。再次列出一个列表,但这次使用b
类型的元素。
现在我们可以尝试对此进行推理。给定一个函数a -> b
和a
,map
的列表似乎是(它确实是)将该列表a
s变换成列表b
s的函数。
下面是一个例子:map (*2) [1,2,3]
。在这种情况下,a
是Integer
(或其他整数类型),每个元素都加倍。 b
也是Integer
,因为(*2)
假定返回类型相同,所以在这种情况下类型变量a
和b
是相同的。情况并非如此;我们可以有一个不同的功能,而不是(*2)
,比如show
,它会产生一个不同于a
的b
,即String
。
用ghci试一下。您可以直接输入map show [1,2,3]
并查看结果。您可以通过将:t前置到该行来查询表达式的类型。
要了解更多信息,您应该查找其中一个奇妙的启动资源。 LYAH有一整章致力于对类型的基本理解,绝对值得一读!
->
是函数类型的类型构造函数。这是一个右联合中缀运算符,意味着它从右边组合在一起。这意味着我们可以通过为右侧的函数添加显式分组来重写类型。
map :: (a -> b) -> [a] -> [b]
map :: (a -> b) -> ([a] -> [b])
对于施加到两个参数,x
和y
,x * y
可以在前缀符号被写为(*) a b
操作*
中缀表达式。我们可以重写前面的类型,从最外层的->
开始,这是中间的一个。
map :: (->) (a -> b) ([a] -> [b])
而且我们现在可以为
(->) a b
function that takes an "a" and return a "b"
最后一种翻译成英语
map :: (->) (a -> b) ([a] -> [b])
map is a function that takes a "(a -> b)" and returns a "([a] -> [b])"
如果我们的解释a -> b ~ (->) a b
(这里~
指的类型是等同的)和解释[a] -> [b] ~ (->) [a] [b]
为
(->) [ a ] [ b ]
function that takes a list of "a"s and returns a list of "b"s
我们说“从a
到b
功能”速记在类型签名
的a
S和b
s为类型变量“它接受一个a
并返回一个b
功能”,他们可以承担任何类型,我们称之为多态。偶尔,你会看到这个明确写入在Haskell作为forall
所以,我们只能说:
map
是各类a
和b
多态值,它是一个功能:
- 需要一个功能从
a
到b
和 - 返回从列表
a
s到b
s列表中的函数。
- 1. 了解Haskell的类型
- 2. 了解haskell中的类型关键字
- 3. 了解haskell的数据类型
- 4. 了解Constr类型的Data.Data包的Haskell
- 5. 了解Haskell seq
- 6. haskell了解fmap
- 7. 了解类型
- 8. 了解Haskell的`toUpper`
- 9. 了解一点Haskell
- 10. 了解haskell代码
- 11. 了解这个表达式的Haskell类型
- 12. 了解一个Haskell类型歧义的案例
- 13. 了解Haskell中的函数定义和类型
- 14. 了解Haskell postgresql连接函数类型错误
- 15. 试图了解Haskell的=> VS定义类型
- 16. Haskell类型类
- 17. 了解类型族
- 18. 了解Java泛型类型
- 19. 了解类型值类
- 20. 如何解开haskell存在类型?
- 21. Haskell解释器/ w类型定义
- 22. Haskell:从类型
- 23. 类型在Haskell
- 24. Haskell TypeCast类型
- 25. 了解haskell中的错误
- 26. 了解Haskell的过滤器
- 27. 了解haskell中的liftM2
- 28. 类型A不等于Haskell(ghci解释器)中的类型A?
- 29. 了解相关类型
- 30. 了解Elm中的类型
这是关于Haskell的一个非常基本的问题。你在用什么学习材料?例如,http://learnyouahaskell.com/types-and-typeclasses对Haskell类型表示法有广泛的解释。 –
你为什么问这样一个基本问题?每个Haskell教程都会很快得到你要求的答案。我觉得这是一个家庭作业任务的问题(但我可能是错的)。 –
请阅读Haskell的简介。 – nomen