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

2007-06-01

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

5.6 A library database

タプルとリストリスト内包表記を使ってDBごっこをしてみましょう、という話(ごっことは書いてないけど)。とっつきにくいけど、ちゃんと読んでみると驚くほど腑に落ちた。これはすごい。

この章では、実際に図書館での本のレンタルについて、データベースを作っている。データベースはこんな感じ。

type Person = String

type Book = String

type Database = { (Person, Book) }

exampleBase :: Database

exampleBase

= [ ("Alice", "Tintin"), ("Anna", "Little Women"), ("Alice", "Asterix"), ("Rory", "Tintin") ]


Exercise 5.12

名前を指定することで、その本を借りている人を取得するbooks関数を使った場合の結果を示す。

books exampleBase "Charlie"

= []

books exampleBase "Rory"

= [ "Tintin" ]


Exercise 5.13

本を指定することで、誰が借りているかを結果として返す関数 borrowers を定義する。

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

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


本を指定することで、その本を借りている人がいるかどうかを返す関数 borrowed を定義する。

borrowed :: Database -> Book -> Bool

borrowed dBase findBook = (length $ borrowers dBase findBook) > 0


人を指定することで、その人が借りている本の数を返す関数 numBorrowed を定義する。

numBorrowed :: Database -> Person -> Int

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


Example 5.14

Databaseから値をDELETEする関数 returnLoan を使った結果を書く。

returnLoan :: Database -> Person -> Book -> Database

returnLoan dBase pars bk

= [ pair | pair <- dBase, pair /= (pers, bk) ]


returnLoan exampleBase "Alice" "Asterix"

= [ ("Alice","Tintin"),("Anna","Little Women"),("Rory","Tintin") ]


returnLoan exampleBase "Alice" "Little Women"

[ ("Alice","Tintin"),("Anna","Little Women"),("Alice","Asterix"),("Rory","Tintin") ]


Example 5.15

データベース定義として、ここまで扱ったような [ (Person, Book) ] を使わず、 [ ( Person2, [Book2] ) ] を使った場合に、データベース関数をどう実装するか論じなさい、という問題。つまり、

exampleBase2 :: Database2

exampleBase2 = [ ("Alice", [ "Tintin", "Little Women" ] ), ("Rory", [ "Asterix", "Little Women" ] ) ]

といったデータベース(Database2型としておく)を扱う関数はどんなものがよいか、という話。

例として、上で定義したborrowersと同じ役割をする関数 borrows2 を定義してみる。

borrows2 :: Database2 -> Book2 -> Person2

borrows2 dBase findBook = [ person | ( person, book ) <- dBase, elem findBook book )

borrowsとborrows2ではelem関数(Perludeのものを使用)を除いて中身は同じ。リスト型になったBook2について、== で比較していた所をelem関数評価するように変更すればよい、と考えられる。


今後の学習

残Section数 93, 残Exercise数 380

AmberAmber2012/05/03 02:13Wowza, problem solved like it never hpapened.

djektcyvhedjektcyvhe2012/05/03 11:05kDGKA2 <a href="http://sqrkksnbxvcg.com/">sqrkksnbxvcg</a>

tabvsztabvsz2012/05/04 09:26aqnkFd , [url=http://zwxuatwalvbd.com/]zwxuatwalvbd[/url], [link=http://jsexnyzeacqj.com/]jsexnyzeacqj[/link], http://ncttmbmhhntv.com/

enkhhyeoueenkhhyeoue2012/05/05 10:463DLBbv <a href="http://veicyyohhexu.com/">veicyyohhexu</a>