Programming in Haskell Chapter3 Exercises Solutions

Programming in Haskell是一本入门Haskell的好书,介绍页面以及配套的slides, vedios, codes都在这里


写出这些表达式的type

1
2
3
4
5
['a', 'b', 'c']             -- :: [Char]
('a', 'b', 'c') -- :: (Char, Char, Char)
[(False, 'O'), (True, '1')] -- :: [(Bool, Char)]
([False, True], ['0', '1']) -- :: ([Bool], [Char])
[tail, init, reverse] -- :: [[a] -> [a]]

写出这些函数的type

1
2
3
4
5
6
second xs       = head (tail xs)    -- [a] -> a
swap (x, y) = (y, x) -- (a, b) -> (b, a)
pair x y = (x, y) -- a -> b -> (a, b)
double x = x * 2 -- Num a => a -> a
palindrome xs = reverse xs == xs -- Eq a => a -> Bool
twice f x = f (f x) -- (a -> a) -> a -> a

在Hugs中验证前两题

第二题中,有几个函数用:t查看的type是用t t1表示的,和a b是一个意思。

为什么“将所有的函数类型都定义为Eq class的实例(instance)”是不可行的?

题目中给出的两个函数相等的定义是这样:

  1. type相同
  2. 对于任意的输入,都拥有相同的输出

显然,编译器不可能对两个函数测试所有的参数来判断它们是否相等。因为可能的参数是有无穷多个的。

深入阅读: Why isn’t every type part of Eq in Haskell?