【问题标题】:In Haskell, why is it important to use Eq a => [a] before a function such as below?在 Haskell 中,为什么在如下函数之前使用 Eq a => [a] 很重要?
【发布时间】:2016-09-19 22:02:23
【问题描述】:

我有这个功能

sameElts :: Eq a => [a] -> Bool 

给定一个列表,当列表的所有元素相等时返回 True,否则返回 False。

例如:

sameElts [1,2] = False
sameElts [2,2] = True
sameElts [2] = True

谁能解释sameElts类型的代码片段Eq a =>的必要性?我假设它强制类型为数字列表,以便使用等于运算符。

【问题讨论】:

  • 当模式匹配Int 时,代码实际上转换为使用== 来检查输入编号是否与模式编号匹配,例如sameElts [1,2] 变成类似于 sameElts [x, y] | x == 1 && y == 2 的东西。我们可以以您的定义不需要Eq的方式定义Ints,例如data Nat = Zero | Succ Nat,但您必须编写sameElts [Succ Zero, Succ (Succ Zero)]等。
  • Eq a 是对您的类型的约束。因此,我首选的解释约束的方式是:如果你说你有一个函数sameElts : [a] -> Bool(那里没有Eq),那么我应该能够给你一个任何类型的列表,例如CrazyFooBarThing,你_不能_以任何方式进行检查,您仍然必须给我一个合理的结果。你能做到吗?

标签: haskell functional-programming


【解决方案1】:

Eq a => sn-p 只要求a 类型在类型类中 Eq,这基本上意味着必须对该类型进行相等性测试。这允许您使用 ==/= 运算符。

例如,数字通过标准库(Prelude)实现Eq,但也有其他类型。您还可以创建自定义数据类型并自己定义相等检查。这使得sameElts 非常通用,因为它适用于Eq 中的任何类型。

【讨论】:

  • 重要的是,函数不在Eq 中,所以如果你有一个类似[(+), (-), (*), (/)] :: [Num a => a -> a -> a] 的列表,sameElts 函数将不起作用。
【解决方案2】:

如果没有Eq a 约束,sameElts 函数将不会任何了解列表中值的类型。特别是,它甚至不知道是否/如何比较元素的(不)相等性。

添加约束意味着只有实例化Eq 类的某种类型的值列表(即可以比较相等的值)可以传递给sameElts,并且sameElts 知道它可以调用值上Eq 类的所有函数部分(例如==)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多