プログラミングHaskell 2章練習問題 解いた

プログラミングHaskellを買ったことによりHaskell入門した。インタプリタあるっていいね。Cとかはインタプリタあればもっと楽なんだろうなと思って探したらなんとインタプリタがある((((;゚Д゚))))ガクガクブルブル

Cling | ROOT a Data analysis Framework

まぁそれは置いといて、解いたやつ下に書いた。

p18

1.括弧をつけなさい
2↑3*4 → 2↑(3*4)×
→(2↑3)*4
2*3+4*5 → (2*3) + (4*5)
2+3*4↑5 →2+(3*(4↑5))

おいおい何してんだ自分。

2.この章の例題を実行する
*Main> 2^3*4
32
*Main> 2*3+4*5
26
*Main> 2+3*4^5
3074

この章の例題ってどれかわからないので1.を実行した。

--3 間違いを三つ修正して、Hugsで実行してください。
{-
N = a `div` length xs
    where
        a = 10
       xs = [1,2,3,4,5]
-}
-- 関数名は小文字から
-- divの囲む文字はバッククォート
-- a/xsのレイアウトを揃える
n = a `div` length xs
       where
         a = 10
         xs = [1,2,3,4,5]
-- *Main> n
-- 2

関数の定義は小文字から始まらないといけないってのを忘れてて、詰んでた。あとdivのバッククォートは本で見たら区別つきにくい。

-- 4.空でないリストの最後の要素を取り出す関数lastの定義。1つ考えたらもう一つ考える。
mylast1 xs = xs !! ((length xs) - 1)
mylast2 xs = xs !! (length xs - 1)
mylast3 xs = head (reverse xs)

-- *Main> mylast1 [1,2,3,4,5]
-- 5
-- *Main> mylast2 [1,2,3,4,5]
-- 5
-- *Main> mylast3 [1,2,3,4,5]
-- 5

length xs はカッコで括らなくても大丈夫だった。もう一つの定義は以前lispバブルソートを作った時の経験が生きた。
mylast1
空でないリストの(0番目から数えて)n番目の要素を取り出す。実質n-1番目が最後の要素なのでlengthに-1したものを最後の要素として得ることができる。

mylast2:
括弧を一つ取り去ったバージョン。このほうが見た目は良い。しかしLispをやっている身としては明示的に合ったほうがなんとなく良い。

mylast3:
リストを反転したものの、先頭の要素が最後の要素となるので、最後の要素を得ることができる。

-- 5.空でないリストから最後の要素を取り除くライブラリ関数initを自分で2通り定義できることを示す。
init1 :: [a] = [a]
init1 xs = take (length xs - 1) xs
init2 :: [a] = [a]
init2 xs = reverse (tail (reverse xs))
{-
Main> init1 [1,2,3,4,5]
[1,2,3,4]
Main> init2 [1,2,3,4,5]
[1,2,3,4]
-}

init1:
takeは先頭からn個の要素を取り出すライブラリ関数。
> take 3 [1,2,3,4,5]
[1,2,3]
最後の要素を取り除いたリストが欲しいので、最後の要素を除いた長さ:n-1 個の要素を取り出せばいい。

init2:
reverseしたリストをtailした(先頭を取り除いた)リストを作ると最後の要素を取り除いたリストが手に入る。そのままだとreverseしたままだからもう一度reverseしてもとのリストに戻す。

感想

ちょっと引っかかるところも多かったけどここらへんはまぁすんなり解けた。
頑張って全部の章の問題を終わらせたい。