Workshop/StartHaskell2/exercise2
『型を信じろ!』 練習問題
型の意味
null関数の型はこんな感じです。これはどういう意味でしたか。(p.24)
数字の絶対値をとる関数absはこんな感じです。どういう意味でしたか。
またtake関数の型はどうでしょうか。
型を考えよう
次の値の型は何ですか?
'a'
['a', 'b', 'c']
('a', 'b', 'c')
'a' == 'a'
("Hello", "world!")
100
show
take 3 [1..]
[(False, 'o'), (True, '1')]
([False, True], ['0', '1'])
[init , tail , reverse]
次の関数の型は何ですか?
second xs = head (tail xs)
swap (x, y) = (y, x)
pair x y = (x, y)
double x = x * 2
palindrome xs = reverse xw == xs
twice f x = f (f x)
上の答えを、ghci を使って確かめましょう。
数字の型クラス
以下の2つの式の型は同じですか、異なりますか。何故ですか。
(ヒント: * と / の型を調べてみよう)
型から動きを考える
以下の関数がどういう動きをするか、型から想像できますか。
hoogleを使ってみよう
succ関数とは反対に、ひとつ前の値を返す関数は何ですか。(ヒント:Hoogleで型を検索してみよう)
与えらえた型から値を想像してみよう
ある日、ghciを使って遊んでいて以下のような結果が得られました。
ところがXXXの部分を覚えていません。 XXXはどのような式になるでしょうか。 (答は一つではありません)
与えらえた型から値を想像してみよう2.
以下の型になる式を探してみよう。
型クラスのインスタンスを探そう
Eq クラスに属する型にはどんなものがありますか。 (ヒント:Hoogleで Eq を検索してみよう)
また Eq クラスと Show クラスの両方に属する型はありますか。
Boundedクラス
Bounded クラスに属する型を探して、その上限値を表示してみよう。 (p.32)
型を変えるだけで動きが変わる
円の直径を求めるcircumference関数の型を Float -> Float から Double -> Double に書き換えると、値の制度が倍になります (p.25)
しかし, この関数の型を Int -> Int に書き換えるとエラーになります。何故ですか。(ヒント: pi の型を確認してみよう)
型エラー
以下の式は型エラーになります。何故ですか。
しかし、以下の式はえらーになりません。何故ですか。(P.33)
型変換
上述の問題で, Int型とDouble型は足せないことを見ました。
この2つを足したいときは, 明示的に型変換をする必要があり、そのための関数が用意されています。(P.33)
この関数を使って, 1 + 1.0 をInt型として足してみましょう。
型エラーを直す
以下のプログラムにはエラーが三つある。エラーを修正し、正しく動くか確かめよ。
(プログラミングHaskell演習2-3)