关于 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
设 f 在 (−∞, ∞) 上定义,证明:如果 f(f(x))
存在唯一的不动点,则 f(x)
也存在唯一的不动点。
存在性:设 f(f(x0)) = x0,则
f(f(f(x0))) = f(x0)。则
f(x0) 也为
f(f(x))
的不动点。由唯一性,知 f(x0) = x0。
唯一性:设 f(x1) = x1,则
f(f(x1)) = x1,再由唯一性,知
x1 = x0。
P2
设 f : ℝ → ℝ
是一个函数,定义 f
的全体“周期”组成的集合 P(f) := [T ∈ ℝ ∣ f(x + T) = f(x), ∀x ∈ ℝ]。
证明:要么 P(f)
稠密,要么存在唯一的 α ≥ 0
使得 P(f) = [nα ∣ n ∈ ℤ]。
首先我们证明:P(f)
对加法、减法封闭。
任取 T1, T2 ∈ P(f),首先,显然
−T2 ∈ P(f)。此外,由于
f(x + (T1 + T2)) = f(x + T1) = f(x),所以
T1...