gpt4 book ai didi

haskell - 列表等的类型签名类型

转载 作者:行者123 更新时间:2023-12-04 16:55:38 24 4
gpt4 key购买 nike

您将如何用简单的英语定义以下类型签名:

Ord a => ...

Eq a => ...

Num a => ...

您能否描述这些含义并让我知道它们之间的区别(就我如何向其他人解释而言)?

谢谢。

最佳答案

这些都是“类约束”的例子:它们限制了可以使用哪些类型来代替跟随它们的类型变量(在本例中为 a),要求它属于特定的 type class . Ord , EqNum是类型类的例子。

  • Ord a => ...意味着 a是一种具有与之关联的自然顺序概念的类型。例如,整数可以自然地从小到大排列。在数学术语中,存在一个 total ordera .需要此约束的函数的一个明显示例是 sort :: Ord a => [a] -> [a] ;读这个签名是说sort仅适用于可以相对于彼此排列的事物列表。
  • Eq a => ...意味着 a是一种类型,其成员可以相互比较以实现某种平等概念。在数学术语中,存在一个 equivalence relationa .请注意,这是 Ord 的父类(super class),这意味着任何有排序概念的东西也必须有等价概念。需要此约束的函数示例是 elem :: Eq a => a -> [a] -> Bool (确定列表是否包含给定元素);读这个签名是说elem仅适用于可以相互比较以实现平等的事物列表。如果您考虑如何写 elem你自己,这应该是有道理的。
  • Num a => ...意味着 a是数字类型,这意味着它支持一些基本的算术运算:+ , * , - , abs .我相信这与 ring 的数学概念大致相似。 .基本上所有你认为是“数字类型”的类型都属于这个类:Int , Double等。您会看到 Num a =>如果函数被编写为与任何类型的数字通用工作,则在签名前约束。例如,sum :: Num a => [a] -> a对数字列表的所有元素求和,同样适用于 [Int] , [Double] , [Rational] ,等等...它所要做的就是将其内容相加,无论它们是什么类型的数字。但他们必须是数字!

  • 基本上,这些类型类/约束是函数“原则性重载”的一种方法。我们可以使用 (==) :: Eq a => a -> a -> Bool在各种类型上,但不仅仅是任何类型。有些东西,例如函数,比较相等性是没有意义的(也许是因为相等性对于该类型是不可判定的),并且比较不同类型的两个事物的相等性永远没有意义(与 Java 相比,其中您可以比较任何两个可能不同类型的对象是否相等)。

    为了进一步(非常容易)阅读类型类和约束,我强烈推荐 Learn You a Haskell .

    关于haskell - 列表等的类型签名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6352779/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com