关于 Haskell 的类型类 (1)(计算概论 A 实验班)
函数的类型从何而来?
考虑以下代码:
12swap :: (a,b) -> (b,a)swap (x, y) = (y, x)
这里并没有对 x 和 y
的类型作任何要求,换言之,显然地,swap(1, 2) = (2, 1)。但是更进一步,swap('a', False) = (False, 'a'),并没有任何问题,所以只需要写
a 和 b 即可。
但是这一段:
12345palindrome :: Eq a => [a] -> Boolpalindrome xs = reverse xs == xsdouble :: Num a => a -> adouble x = x * 2
首先,palindrome 的运行依赖于 ==
的实现。换言之,如果 [a] 中的 a 不支持
== 操作(也即不在 Eq
定义下),那么以下的语句是无法正常运行的,所以我们需要额外地限定
Eq a。
进一步,double 的运行则依赖
*,所以我们要保证乘法这一行为合法。考虑限制
Num a,即说明 * 是良定的。
两个典型的类型类
...
一些常用不等式等(数学分析)
带有 (*) 号的题目表示难度较大或/且与课程内容联系较弱
P1
设 fff 在 (−∞,∞)(-\infty,\infty)(−∞,∞) 上定义,证明:如果 f(f(x))f(f(x))f(f(x))
存在唯一的不动点,则 f(x)f(x)f(x) 也存在唯一的不动点。
存在性:设 f(f(x0))=x0f(f(x_0))=x_0f(f(x0))=x0,则 f(f(f(x0)))=f(x0)f(f(f(x_0)))=f(x_0)f(f(f(x0)))=f(x0)。则 f(x0)f(x_0)f(x0) 也为
f(f(x))f(f(x))f(f(x)) 的不动点。由唯一性,知 f(x0)=x0f(x_0)=x_0f(x0)=x0。
唯一性:设 f(x1)=x1f(x_1)=x_1f(x1)=x1,则 f(f(x1))=x1f(f(x_1))=x_1f(f(x1))=x1,再由唯一性,知
x1=x0x_1=x_0x1=x0。
P2
设 f:R→Rf:\mathbb{R}\to\mathbb{R}f:R→R 是一个函数,定义 ff...