morioXのCraftお勉強日記 RSSフィード

2007-06-13

[] Data types: tuples and lists (13日目)  Data types: tuples and lists (13日目) - morioXのCraftお勉強日記 を含むブックマーク

Exercises 5.26

フィボナッチ数を表っぽく表示する関数 fibTable を定義する。まずその前に、フィボナッチ数 fib の定義を先に書いておく。

fib :: Int -> Int

fib n

 | n == 0 = 0

 | n == 1 = 1

 | n > 1 = fib (n - 2) + fib (n - 1)

この他にも、以前のExercisesで定義した duplicate, pushRightNumを使って、fibTableを定義する。

fibTable :: Int -> String

fibTable n

 | n == (-1) = (duplicate " " 9) ++ "n" ++ (duplicate " " 6) ++ "fib n"

 | otherwise = fibTable (n - 1) ++ "\n" ++ (pushRightNum 10 $ show n) ++ " " ++ (pushRightNum 10 $ show $ fib n)

Exercises 5.27

この章で出てきたデータベースアクセス関数を見やすい出力になるよう定義しなさい、という問題。books 関数の定義をいじってみることにする。

まず、元ネタの books 関数を示す。

books :: Database -> Person -> [Book]

books dBase findPerson

 = [ book | (person, book) <- dBase, person == findPerson ]

定義する関数を formattedBooks とする。

formattedBooks :: [Book] -> Person -> String

formattedBooks bks findPerson

 | length bks == 0 = findPerson ++ " borrows nothing."

 | length bks == 1 = findPerson ++ " borrows "++ head bks

 | otherwise = (formattedBooks (tail bks) findPerson) ++ " and " ++ head bks

いまいち綺麗にならなかったかも。


Summary

リストとタプルに関する基本的な話題が中心だった。


今後の学習

残Section数 90, 残Exercise数 368

BarbaraBarbara2012/07/24 05:27Finding this post has answered my peryars

lgbmlzlgbmlz2012/07/25 01:50ytCi8x <a href="http://ahsuszkcbmrj.com/">ahsuszkcbmrj</a>

jdxkaqjdxkaq2012/07/26 18:39JXcHg6 <a href="http://orvmhquzzxav.com/">orvmhquzzxav</a>

2007-06-12

[] Data types: tuples and lists (12日目)  Data types: tuples and lists (12日目) - morioXのCraftお勉強日記 を含むブックマーク

Exercises 5.23

文字列のコピーを行う関数 duplicate を定義する。

duplicate :: String -> Int -> String

duplicate str n

 | n <= 0 = ""

 | otherwise = str ++ (duplicate str (n - 1) )


Exercises 5.24

設定した行の長さ(12文字)にあわせて、入力した文字の右寄せを行う関数 pushRight を定義する。

pushRight :: String -> String

pushRight str

 | length str > 12 = pushRight $ tail str

 | length str < 12 = duplicate " " (12 - (length str) )

 | otherwise = str


行の長さを引数で設定可能とする関数 pushRightNum も定義する。

pushRightNum :: Int -> String -> String

pushRightNum num str

 | legnth str > num = pushRight num $ tail str

 | length str < num = " " ++ pushRight (num - 1) str

 | otherwise = str


Exercises 5.25

直前の関数が特定された方法を批評することができるか?という問題(誤読かも)。よくわからず。遅延評価を指しているのかな。



今後の学習

残Section数 90, 残Exercise数 370

IdrusIdrus2012/10/02 22:05I had no idea how to approach this before-now I'm locked and loedad.

bfeulmknbfeulmkn2012/10/04 12:42seaaPW <a href="http://xlxlofmkhtdq.com/">xlxlofmkhtdq</a>

ngvoeghhngvoeghh2012/10/06 13:49PUWF0p , [url=http://ufvdnzpmwthu.com/]ufvdnzpmwthu[/url], [link=http://ojizgposlzkk.com/]ojizgposlzkk[/link], http://jnfookqovwhy.com/

2007-06-05

[] Data types: tuples and lists (11日目)  Data types: tuples and lists (11日目) - morioXのCraftお勉強日記 を含むブックマーク

Exercises 5.20

入力した Char 型の数字1文字を String 型に変換する関数 romanDigit を定義する。

romanDigit :: Char -> String

romanDigit chr

 | chr == '9' = "IX"

 | chr == '4' = "IV"

 | (ord chr - ord '0') `div` 5 == 1 = "V" ++ replicate ( (ord chr - ord '5') `mod` 5) 'I'

 | otherwise = replicate ( (ord chr - ord '0') `mod` 5) 'I'

なんというか、4と9がぴったりはまらない。どうやっても9にだけXが入ってしまうので、頑張ってもあんまり美しくはならないかもなあ、とは思うけど。


Exercises 5.21

入力された3つの単語を改行コード込みで3行となる1つの文字列にする関数 onThreeLines を定義する。

onThreeLines :: String -> String -> String -> String

onThreeLines str1 str2 str3 = str1 ++ "\n" ++ str2 ++ "\n" ++ str3 ++ "\n"

文末にも改行文字を付けておき、次の行のプロンプトに影響が出ないようにした。といっても、Hugsで直接実行したときには、改行文字がそもそも認識されずに、"\n" と表示されてorzだったけど。

いちおうGHC 6.6で確認して、(putStrを使った出力では)改行表示が確認できたので、これでよいかと。


Exercises 5.22

入力されたリストを改行コード込みで各行に分割して表示する関数 onSeparateLines を定義する。Exercises 5.21 のリスト版。

onSeparateLines :: [String] -> String

onSeparateLines list

 | list == [ ] = [ ]

 | otherwise = (head list) ++ "\n" ++ (onSeparateLines $ tail list)


今後の学習

残Section数 90, 残Exercise数 373

DepresionDepresion2012/05/03 10:35I can already tell that's gonna be super helfupl.

qdzlibjwthcqdzlibjwthc2012/05/04 06:03zLM5DO <a href="http://gdtpmzhjpnkl.com/">gdtpmzhjpnkl</a>

gjguotjbuggjguotjbug2012/05/04 09:1176f8wQ , [url=http://yhkdrjamgupc.com/]yhkdrjamgupc[/url], [link=http://iycpoihrwamb.com/]iycpoihrwamb[/link], http://airccjqhswiu.com/

etkdfnextgetkdfnextg2012/05/05 12:06jWSSLI <a href="http://ogarqefhelzz.com/">ogarqefhelzz</a>

2007-06-03

[] Data types: tuples and lists (10日目)  Data types: tuples and lists (10日目) - morioXのCraftお勉強日記 を含むブックマーク

5.9 The String type

文字列型、つまりString型の話。表示用の関数として putStr がようやく登場。putStr は Hugs を使ってるうちはあんまりお世話にならないんだよな、そういえば(使い方のレベルが低いからかもしれないが)。

あとは、あらゆる型の値を String 型に変換する show 関数と、その逆を行う read 関数の話。read 関数の場合は、実際の所、ちゃんと元の型が呼び出せるかどうか不透明なところがあるので、型を指定して read することが可能。

(read "3" :: Int)


Exercises 5.19

小文字が入力されれば大文字に変換して返し、それ以外の文字については、そのまま返す関数、capitalizeChar を定義する。

capitalizeChar :: Char -> Char

capitalizeChar c

 | isLower c = toUpper c

 | otherwise = c


今後の学習

残Section数 90, 残Exercise数 376

2007-06-02

[] Data types: tuples and lists (9日目)  Data types: tuples and lists (9日目) - morioXのCraftお勉強日記 を含むブックマーク

5.7 Generic functions: polymorphism

型変数の話。lengthは、入力する変数リストであれば、特に(中身の)型を問わずに処理を行うことが出来る。["Str", "Str", "Str"] でも、[1, 2, 3]でも同じように扱える。このような関数は、以下のように定義する。

length :: [a] -> Int

ここで使った「a」型変数と呼ぶ、という話。このように、たくさんの型を扱える関数を「polimorphic」と呼ぶ。

polimorphic とか、polimorphism なんて単語が出てきているけど、Javaで有名な polimorphism とはどうも違うようだ。あっちは、インタフェースに突っ込むクラスの中身によって、呼び出されるメソッドが変わるとかそんな話だったしな。このあたりは、今度勉強しておいた方がよさそうだ。


Exercise 5.16

与えられている関数に、型の定義を与える問題。もちろん型変数も使用する。

snd :: (a, b) -> b

snd (x,y) = y

sing :: a -> [a]

sing x = [x]


Exercise 5.17

入力された値をそのまま返す関数 id について、

id x = x

以下のような型定義を行うのがまずい理由について説明する。

id :: [ [a] ] -> [ [a] ]

上の定義をもっと一般的な形で定義すると、以下のように表せるので、そちらのほうが適切、というのが答えか。

id :: a -> a


Exercise 5.18

以下の関数について、型変数を使った形で型を定義しなさい、という問題。

shift :: ( (Int, Int), Int ) -> ( Int, (Int, Int) )

shift ( (x, y), z ) = ( x, (y, z) )

こんなもんでよいかと。

shift :: ( (a, a), a ) -> ( a, (a, a) )


5.8 Haskell list functions in Prelude.hs

Prelude には、リストを扱うための関数がいろいろあるよ、という話。いちおう型定義だけ並べておく。ちなみに、全角文字が混じっているのははてな記法に間違われるのを防ぐのが目的

:: :: a -> [a] -> [a]

++ :: [a] -> [a] -> [a]

!! :: [a] -> Int -> a

concat :: [ [a] ] -> [a]

length :: [a] -> Int

head,last :: [a] -> a

tail,init :: [a] -> [a]

replicate :: Int -> a -> [a]

take :: Int -> [a] -> [a]

drop :: Int -> [a] -> [a]

splitAt :: Int -> [a] -> ( [a], [a] )

reverse :: [a] -> [a]

zip :: [a] -> [b] -> [ (a, b) ]

unzip :: [ (a, b) ] -> ( [a], [b] )

and :: [Bool] -> Bool

or :: [Bool] -> Bool

sum :: [Int] -> Int

sum :: [Float] -> Float

product :: [Int] -> Int

product :: [Float] -> Float

Map関数に代表される高階関数話はもっと後で、とのこと。


今後の学習

残Section数 91, 残Exercise数 377