2011-07-06 70 views
0

我對Haskell相當陌生,並且試圖自學Addison-Wesley的書中的語言 - 函數式編程工藝。數據庫函數 - Haskell初學者需要幫助!

我卡上的運動之一,並想知道如果有人也許可以幫助:

我需要定義一個函數

borrowed :: Database -> Book -> Bool 

在圖書館數據庫,可以檢查是否一本書在數據庫中已經借用,如果有,則返回True,否則返回False。這可能是一個非常簡單的解決方案,但我似乎無法弄清楚!任何幫助將是巨大的

乾杯

P

+0

你可以給我們一些關於'數據庫'類型的信息嗎? –

+0

嗨喬納森,它是簡單定義類型數據庫= [(人,書)] – user832488

+0

謝謝!如果在我回家的時候沒有人問過這個問題,我會回答它(現在就開始工作)。與Haskell一起玩吧! –

回答

2

你只是想看看書出現在列表中的任何地方。看看這個簡單的方法是通過書籍列表上的歸納。當有一本書借出,你要比較的是,

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

我假設數據庫是對的人,那人已簽出一本書的名單。

import Data.List (find) 
import Data.Maybe (isJust) 

whoBorrowed :: Database -> Book -> Maybe Person 
whoBorrowed database book = fmap fst $ find ((== book) . snd) database 

borrowed :: Database -> Book -> Bool 
borrowed database book = isJust $ whoBorrowed database book 

您是否明白這一切意味着什麼,或者您希望我爲您擴展它?

編輯:

  • 不再使用的<$>從Control.Applicative;換成fmap。他們的意思完全一樣。
  • 從Control.Arrow中刪除使用second;換成. snd。其實,我使用second是一個bug,現在已經修復了。
+0

嗨戴夫,謝謝你回答。無論如何你可以做到這一點,而不使用Applicative和Arrow的導入?它只是我還沒有學到這一點,它扔我有點大聲笑! – user832488

+0

此外,我已經定義了一個書的功能如下 - 是否有無論如何,你可以推薦類似於這是如何定義?書籍::數據庫 - >人物 - > [圖書] 書籍db searchPerson = [bookName | (personName,bookName)< - db,personName == searchPerson] – user832488

+0

@ user832488 1.看我的編輯。對不起,我不確定你想要我推薦什麼。你對「書」的定義看起來很好。也許編輯你的問題來包含這個新標準? – dave4420

0

any函數定義只是爲了這個目的!

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

當然,這種易於閱讀的定義可以以任何方式進行修改。例如,有些人可能更喜歡這種形式:

borrowed db book = any ((book==) . snd) db