我對Haskell相當陌生,並且試圖自學Addison-Wesley的書中的語言 - 函數式編程工藝。數據庫函數 - Haskell初學者需要幫助!
我卡上的運動之一,並想知道如果有人也許可以幫助:
我需要定義一個函數
borrowed :: Database -> Book -> Bool
在圖書館數據庫,可以檢查是否一本書在數據庫中已經借用,如果有,則返回True,否則返回False。這可能是一個非常簡單的解決方案,但我似乎無法弄清楚!任何幫助將是巨大的
乾杯
P
我對Haskell相當陌生,並且試圖自學Addison-Wesley的書中的語言 - 函數式編程工藝。數據庫函數 - Haskell初學者需要幫助!
我卡上的運動之一,並想知道如果有人也許可以幫助:
我需要定義一個函數
borrowed :: Database -> Book -> Bool
在圖書館數據庫,可以檢查是否一本書在數據庫中已經借用,如果有,則返回True,否則返回False。這可能是一個非常簡單的解決方案,但我似乎無法弄清楚!任何幫助將是巨大的
乾杯
P
你只是想看看書出現在列表中的任何地方。看看這個簡單的方法是通過書籍列表上的歸納。當有一本書借出,你要比較的是,
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
+1用於在指向庫函數之前顯示幼稚的遞歸解決方案。 – Landei
我假設數據庫是對的人,那人已簽出一本書的名單。
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
。他們的意思完全一樣。second
;換成. snd
。其實,我使用second
是一個bug,現在已經修復了。嗨戴夫,謝謝你回答。無論如何你可以做到這一點,而不使用Applicative和Arrow的導入?它只是我還沒有學到這一點,它扔我有點大聲笑! – user832488
此外,我已經定義了一個書的功能如下 - 是否有無論如何,你可以推薦類似於這是如何定義?書籍::數據庫 - >人物 - > [圖書] 書籍db searchPerson = [bookName | (personName,bookName)< - db,personName == searchPerson] – user832488
@ user832488 1.看我的編輯。對不起,我不確定你想要我推薦什麼。你對「書」的定義看起來很好。也許編輯你的問題來包含這個新標準? – dave4420
的any
函數定義只是爲了這個目的!
borrowed db book = any (\(person, book') -> book' == book) db
當然,這種易於閱讀的定義可以以任何方式進行修改。例如,有些人可能更喜歡這種形式:
borrowed db book = any ((book==) . snd) db
你可以給我們一些關於'數據庫'類型的信息嗎? –
嗨喬納森,它是簡單定義類型數據庫= [(人,書)] – user832488
謝謝!如果在我回家的時候沒有人問過這個問題,我會回答它(現在就開始工作)。與Haskell一起玩吧! –