关于 Haskell 的类型类 (1)(计算概论 A 实验班)
函数的类型从何而来?
考虑以下代码:
1 | swap :: (a,b) -> (b,a) |
这里并没有对 x 和 y
的类型作任何要求,换言之,显然地,swap(1, 2) = (2, 1)。但是更进一步,swap('a', False) = (False, 'a'),并没有任何问题,所以只需要写
a 和 b 即可。
但是这一段:
1 | palindrome :: Eq a => [a] -> Bool |
首先,palindrome 的运行依赖于 ==
的实现。换言之,如果 [a] 中的 a 不支持
== 操作(也即不在 Eq
定义下),那么以下的语句是无法正常运行的,所以我们需要额外地限定
Eq a。
进一步,double 的运行则依赖
*,所以我们要保证乘法这一行为合法。考虑限制
Num a,即说明 * 是良定的。
两个典型的类型类
(这些是 AI 生成的)
Integral 类型类(整数运算)
1 | -- div:整数除法(截断) |
Fractional 类型类(小数运算)
1 | -- 普通除法:/ |
在 ghci 中实验:逐行输入上述代码观察结果
查看类型信息:使用
:t命令查看函数类型1
2
3
4> :t div
div :: Integral a => a -> a -> a
> :t (/)
(/) :: Fractional a => a -> a -> a探索更多函数:使用
:info查看类型类详细信息1
2> :info Integral
> :info Fractional
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Sept!