Month of 1月, 2010

プログラミングHaskell (第八章の練習問題)

in

翻訳片手に再びトライ。この章にあるdo構文は、ghci環境では動作しないこともあり等価の(>>=)を使い(原著p77,翻訳p93参照)ます。また、ghci環境下ではPrelude.>>=と重複するためすべてMainの修飾子を付加しています。

8.10 (1) int::Parser Intを定義せよ

プログラミングHaskell (第八章の練習問題)の前に

in

八章は原著で玉砕していて僕にとっては鬼門です。練習問題に入る前に原著を読んだときに躓いたことを整理しておくと、躓きはテキストの例題にある1番目と3番目をペアで返すpのコード

p = do x <- item'
       _ <- item'
       y <- item'
       return' (x,y)

を入力してもエラーになって先に進めなかったこと。このこと自体はググってみたら、

p = item Main.>>= \x ->
    item Main.>>= \_ ->
    item Main.>>= \y ->
    return' (x,y)

のように、(>>=)を使えばうまくコードを実行できることはわかったのですが、肝心の実装が理解できず苦しみました。例えば、`parse item "abcde"`の結果が('a',"bcde")であるなら、`p "abcde"`は、

return' (('a',"bcde"),('c',"de"))

じゃないの?というところから抜け出せずにい(た|る)わけです。

プログラミングHaskell (第七章の練習問題)

in

7.8 (1) [f x|x <- xs, p x]をmapとfilterを使って書き直すとどうなるか?

a'::[Int]
a' = map f (filter p xs)
  where
    xs = [1,3..50]
    f  = (*2)
    p  = (<18)

まあ、これはいいかな。

7.8 (2) 標準ライブラリの定義をみないでall,any,takeWhile,dropwhileを定義せよ

プログラミングHaskell (第六章の練習問題)

in

新年おめでとうございます。本年もボチボチとよろしくおつきあいいただける僕としてもうれしいです。

6.8 (1) 負でない整数に対する累乗演算子を定義せよ。またその定義で2^3を簡約せよ

(#) :: Int -> Int -> Int
m # 0 = 1
m # (n + 1) = m * (m # n)

(Prelude.^)とバッティングするので(#)にしてます。

 2#3
 = 2*(2#2)
 = 2*2*(2#1) 
 = 2*2*2*(2#0) 
 = 2*2*2*1
 = 8

ところで、僕の解答ですが括弧がないです。一見したときは正しいと思ったのですがこの間違いは大きい気がします。結果の8は同じですが、問題の意図からすれば零点といってもいいくらい。