【发布时间】: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