2014-02-24 110 views
0

我需要遞歸遍歷函數中的兩個列表,我看不到一種方法來實現它。haskell中的多個遞歸函數

siteRating6OrHigher :: [Film] -> [String] 
siteRating6OrHigher [] = [] 
siteRating6OrHigher ((Film title _ _ ((_, rating):ratings)):restOfFilms) 
    | rating >= 6 = [title] ++ siteRating6OrHigher restOfFilms 
    | otherwise = siteRating6OrHigher restOfFilms 

我的數據被格式化:testDatabase = [Film "Blade Runner" "Ridley Scott" 1982 [("Amy",6), ("Bill",9), ("Ian",7), ("Kevin",9), ("Emma",4), ("Sam",5), ("Megan",4)],

所以目前我遞歸通過「restOfFilms」,但我還需要通過在電影類型等級列表遞歸。有沒有辦法做到這一點,所以它通過每個電影的每組評價遞歸?

感謝

數據結構:

data Film = Film String String Int [(String, Int)] 
     deriving (Eq,Ord,Show,Read) 
+0

您能否提供您正在使用的數據結構,因此示例爲[self-contained](http://www.sscce.org/)? –

+0

添加了定義 – user3347868

+0

您想要對收視率做什麼? –

回答

3

我會FMAP在列表中,將任何等級> 6成布爾值true,然後用foldr相似經歷的清單,(||)和默認值false,如果其中任何一個大於6,則應該將該列表減少爲單個True,否則爲False。

foldr (||) False (fmap ((> 6) . snd) ratings) 

EDIT:簡單,因爲每Rhymoid的建議

編輯2:整個溶液。

siteRating6OrHigher :: [Film] -> [String] 
siteRating6OrHigher [] = [] 
siteRating6OrHigher ((Film title _ _ ratings):restOfFilms) 
    | above60 ratings = [title] ++ siteRating6OrHigher restOfFilms 
    | otherwise = siteRating6OrHigher restOfFilms 
    where above60 = any ((> 6) . snd) 
+1

請注意,任何p = foldr(||)False。地圖p'由Prelude提供:你可以使用'any(> 6)'代替。 – 2014-02-24 18:36:30

+0

編譯得很好,但仍然只返回第一個評級大於6的電影,但似乎沒有遞歸其他電影 – user3347868

+0

查看完整的編輯。 –