【发布时间】:2018-12-28 08:22:09
【问题描述】:
当我们有一个使用==比较运算符比较两个事物的函数时,我们将Eq a => a...之类的东西添加到类型声明中;但情况似乎并非总是如此。
例如,给定以下函数:
tail' xs = if length xs == 0
then []
else drop 1 xs
我们使用==比较运算符,所以我假设正确的类型声明是:
tail':: (Eq a) => [a] -> [a]
但是,运行 :t tail' 告诉我正确的类型声明是:
tail':: [a] -> [a]
为什么会这样?为什么类型声明中不需要Eq?
【问题讨论】:
-
您应该尽可能使用模式匹配(例如这里),而不是使用
==。此外,还需要花几分钟时间研究列表是如何定义的,并考虑因此,length、last或!!等常见类似数组的操作的时间复杂度必须是多少。 -
还要注意
drop 1 []已经是[],尽管我知道这不是你问题的重点:-)
标签: haskell