[英]Understanding Haskell types [duplicate]
这个问题已经在这里有了答案:
我需要了解类型如何工作并可以解释。
例如,如果我们使用map函数,则我们有map ::(a-> b)-> [a]-> [b]
好吧,我该怎么解释?
->
是用于函数类型的类型构造函数。 这是一个右关联的中缀运算符,意味着它是从右开始组合在一起的。 这意味着我们可以通过在右侧添加功能的显式分组来重写类型。
map :: (a -> b) -> [a] -> [b]
map :: (a -> b) -> ([a] -> [b])
应用于两个参数x
和y
的运算符*
的中缀表达式, x * y
可以用前缀符号(*) ab
编写。 我们可以重写最前面的类型,从最外面的->
,它是中间的那个。
map :: (->) (a -> b) ([a] -> [b])
现在我们可以将最后一种类型翻译成英文
map :: (->) (a -> b) ([a] -> [b])
map is a function that takes a "(a -> b)" and returns a "([a] -> [b])"
我们将a -> b ~ (->) ab
( a -> b ~ (->) ab
(这里~
表示类型等效)解释为
(->) a b
function that takes an "a" and return 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
并返回b
的函数”的简写
类型签名中的a
s和b
s是类型变量,它们可以采用任何类型,我们称之为多态。 偶尔,你会看到这个明确写入在Haskell作为forall
所以,我们只能说:
map
是所有类型a
和b
的多态值,该函数是:
a
到b
取一个函数 a
s到列表b
秒。 这个签名包含->
的事实告诉我们这是一个函数。 最后一个->
之后的内容是完全应用后的函数的返回类型。 让我们看看各个部分。
(a -> b)
这是第一个参数,它也是一个函数。 这意味着map
是一个高阶函数-它接受一个函数作为其参数之一。 a -> b
本身是一个将a类型a
值转换为b
类型a
值的函数。
[a]
第二个论点。 方括号是表示列表的特殊语法。 该参数,因此,是与类型的元素列表a
。
[b]
结果的类型。 再次列出,但这次具有类型b
元素。
我们现在可以尝试对此进行推理。 给定一个函数a -> b
和清单a
, map
似乎是(它确实是),其转换的该列表的功能a
s转换列表b
秒。
这是一个示例: map (*2) [1,2,3]
。 在这种情况下, a
为Integer
(或其他整数类型),并且每个元素都加倍。 b
也是Integer
,因为(*2)
假定相同的返回类型,所以在类型变量a
和b
相同的情况下。 不必是这种情况; 我们可以有不同的功能,而不是(*2)
说show
这将产生一个b
不同于a
,即String
。
在ghci中尝试一下。 您可以直接输入map show [1,2,3]
并查看结果。 您可以通过在该行之前添加:t来查询表达式的类型。
要了解更多信息,您应该查找出色的入门资源之一。 LYAH有一整章专门介绍类型的基本知识,绝对值得一读!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.