2011-07-06 13 views
0

私はハスケルをかなり新しくしており、Addison-Wesleyの本 - 機能プログラミングの技法から自分自身を教えようとしています。データベース機能 - 初心者の助けが必要なハスケル!

は私が演習のいずれかにこだわっていると、誰かが助けることができるかもしれないのか疑問に思っ:

を私は本かどうかを確認することができライブラリデータベースオーバー機能

borrowed :: Database -> Book -> Bool 

を定義する必要がありますそれが持っていればTrueを返し、そうでなければFalseを返します。それは本当に簡単な解決策かもしれませんが、私はそれを把握していないようです!すべてのヘルプは

乾杯

P

+0

「データベース」タイプについての情報はありますか? –

+0

こんにちはJonathan、それは単純に定義された型です。Database = [(Person、Book)] – user832488

+0

ありがとう!私が家に帰る時までにこの質問に誰も出かけることがなかったら、私はそれに答えるでしょう(今仕事を残す)。ハスケルと一緒に楽しく過ごせ! –

答えて

2

素晴らしいことだあなただけのブックリストの任意の場所に表示されるかどうか確認したいです。これを見るための簡単な方法は、本のリストの紹介を介してです。 1冊の本が貸し出しありますときに、あなたは、次に

borrowed [(loan_to, loan_book)] key = loan_book == key 

は、あなたがより多くの本を見ているとき、あなたはあなたの鍵は、それらのいずれかの間にあるかどうかを確認したい、という比較したい

borrowed [] key = False 
borrowed ((loan_to, loan_book):loans) key = key == loan_book || borrowed loans key 

あなたには、いくつかの標準ライブラリ関数を学ぶとき、あなたが何かのようにそれをクリーンアップすることができ、

borrowed loans key = any ((==key) . snd) loans 
+0

+1は、ライブラリ関数を指す前に素朴な再帰的解を示すためのものです。 – Landei

1

私は、データベースが、人と人がチェックアウトした書籍のペアのリストであると仮定しています。

あなたはそれが何を意味するのか理解していますか?

編集:Control.Applicativeから<$>の使用を削除

  • fmapに置き換えられました。彼らはまったく同じことを意味します。
  • Control.Arrowのsecondの使用を削除しました。 . sndに置き換えられました。実際、私のsecondの使用はバグで、今修正されました。
+0

こんにちはデイブ、それに感謝のおかげで。あなたはApplicativeとArrowの輸入品を使わなければそれはできますか?そのちょうど私はまだこれを学んでいないと私は少し笑を投げて! – user832488

+0

また、Book関数を次のように定義しました。これがどう定義されているのと似ているとお勧めできますか?書籍::データベース - >人物 - > [書籍] books db searchPerson = [bookName | (personName、bookName)< - db、personName == searchPerson] – user832488

+0

@ user832488 1.私の編集を参照してください。 2.申し訳ありませんが、あなたが私に何をお勧めしたいのか分かりません。あなたの「本」の定義はうまくいきます。おそらく、この新しい基準を含めるように質問を編集しますか? – dave4420

0

any関数がこの目的のためだけに定義されました。

borrowed db book = any (\(person, book') -> book' == book) db 

もちろん、この読みやすい定義は、任意の数の方法で変更することができます。たとえば、次のような形式を好む人もいます。

borrowed db book = any ((book==) . snd) db 
関連する問題