簡體   English   中英

Haskell高階函數

[英]Haskell Higher Order Function

我無法從這個給定的數據庫中輸出某些信息:

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嗎? 如果有,以類似的方式解決我的問題?

提前致謝!

在第一種情況下,您要檢查人y是否包含在粉絲列表中,因此elem ya

在第二種情況下,你想檢查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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM