2013-04-20 86 views
0

我無法從這個給定的數據庫輸出的某些信息位:Haskell的高階函數

type Title = String 
type Actor = String 
type Cast = [Actor] 
type Year = Int 
type Fan = String 
type Fans = [Fan] 
type Period = (Year, Year) 
type Film = (Title, Cast, Year, Fans) 
type Database = [Film] 

testDatabase :: Database 
testDatabase = [("Casino Royale", ["Daniel Craig", "Eva Green", "Judi Dench"], 2011, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]), 
    ("Cowboys & Aliens", ["Harrison Ford", "Daniel Craig", "Olivia Wilde"], 2011, ["Bill", "Jo", "Garry", "Kevin", "Olga", "Liz"]),  
     ("Catch Me If You Can", ["Leonardo DiCaprio", "Tom Hanks"], 2006, ["Zoe", "Heidi", "Jo", "Emma", "Liz", "Sam", "Olga", "Kevin", "Tim"])] 

注意:這僅僅是數據庫的一部分,由於列表的大小。

我想寫一個函數,允許用戶輸入一年和輸出只有電影標題..我做了一個類似的粉絲,用戶輸入一個粉絲名稱和輸出他們是電影的...這個代碼如下所示風扇:

filmsByFan y = map (\(a,_,_,_) -> a) $ filter (\(_,_,_,a) -> elem y a) testDatabase 

這工作100%,所以我嘗試了一個類似與byYear:

filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> elem y a) testDatabase 

但是,這並不編譯.. 。是因爲類型Year設置爲Int?如果是的話,是否有類似的方式解決我的問題?

在此先感謝!

回答

2

在第一種情況下,要檢查的人y是否在球迷名單包含,因此elem y a

在第二種情況下,要檢查一年y是否等於到薄膜的一年,因此,您只需將檢查平等,a == y

filmsByYear y = map (\(a,_,_,_) -> a) $ filter (\(_,_,a,_) -> a == y) testDatabase 

順便說一句,這代碼將更具可讀性,如果您給lambda命名:

title (t, _, _, _) = t 
fans (_, _, _, fs) = fs 
year (_, _, y, _) = y 

而且它更習慣於使用功能鏈接:

filmsByFan f = map title $ filter (elem f . fans) testDatabase 
filmsByYear y = map title $ filter ((== y) . year) testDatabase 

現在,你可能會看上一個模式,它本身可以很好地抓住了一個高階函數:

filmsBy func = map title $ filter func testDatabase 
filmsByFan f = filmsBy (elem f . fans) 
filmsByYear y = filmsBy ((== y) . year) 
+0

我修改了代碼,但是這是我的錯誤正在獲取--------------------由於使用'=='而沒有(Eq([Year] - > Bool)) 的實例 可能的修復:添加(Eq([Year] - > Bool)的實例聲明) 在表達式中:elem a == y 在'filter'的第一個參數中,即 '(\(_,_,a,_) - > elem a == y) ' '($)'的第二個參數,即 'filter(\(_,_,a,_) - > elem a == y)testDatabase' – user2240649 2013-04-20 15:11:30

+0

我測試過了,我很確定有用。你如何調用函數? – Thomas 2013-04-20 15:21:28

+0

不用擔心,我現在正在工作!非常感謝您的意見! – user2240649 2013-04-20 15:34:07