繁体   English   中英

了解Haskell类型[重复]

[英]Understanding Haskell types [duplicate]

这个问题已经在这里有了答案:

我需要了解类型如何工作并可以解释。

例如,如果我们使用map函数,则我们有map ::(a-> b)-> [a]-> [b]

好吧,我该怎么解释?

->是用于函数类型的类型构造函数。 这是一个右关联的中缀运算符,意味着它是从右开始组合在一起的。 这意味着我们可以通过在右侧添加功能的显式分组来重写类型。

map :: (a -> b) ->  [a] -> [b]
map :: (a -> b) -> ([a] -> [b])

应用于两个参数xy的运算符*的中缀表达式, 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 ~ (->) aba -> 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

我们说“从ab的函数”是“取a并返回b的函数”的简写

类型签名中的a s和b s是类型变量,它们可以采用任何类型,我们称之为多态。 偶尔,你会看到这个明确写入在Haskell作为forall所以,我们只能说:

map是所有类型ab的多态值,该函数是:

  • ab取一个函数
  • 从返回一个列表的功能a s到列表b秒。

这个签名包含->的事实告诉我们这是一个函数。 最后一个->之后的内容是完全应用后的函数的返回类型。 让我们看看各个部分。

(a -> b)

这是第一个参数,它也是一个函数。 这意味着map是一个高阶函数-它接受一个函数作为其参数之一。 a -> b本身是一个将a类型a值转换为b类型a值的函数。

[a]

第二个论点。 方括号是表示列表的特殊语法。 该参数,因此,是与类型的元素列表a

[b]

结果的类型。 再次列出,但这次具有类型b元素。

我们现在可以尝试对此进行推理。 给定一个函数a -> b和清单amap似乎是(它确实是),其转换的该列表的功能a s转换列表b秒。

这是一个示例: map (*2) [1,2,3] 在这种情况下, aInteger (或其他整数类型),并且每个元素都加倍。 b也是Integer ,因为(*2)假定相同的返回类型,所以在类型变量ab相同的情况下。 不必是这种情况; 我们可以有不同的功能,而不是(*2)show这将产生一个b不同于a ,即String

在ghci中尝试一下。 您可以直接输入map show [1,2,3]并查看结果。 您可以通过在该行之前添加:t来查询表达式的类型。

要了解更多信息,您应该查找出色的入门资源之一。 LYAH有一整章专门介绍类型的基本知识,绝对值得一读!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM