我需要通过函数中的两个列表进行递归,但是我看不到这样做的方法。
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 :(得分:3)
我会对列表进行fmap,转换任何评分> 6进入布尔值True,然后使用foldr通过列表(||)
和默认值False,这应该将列表减少为单个True如果任何高于6则为False,否则为False。
foldr (||) False (fmap ((> 6) . snd) ratings)
编辑:根据Rhymoid的建议更简单
编辑2 :整个解决方案。
siteRating6OrHigher :: [Film] -> [String]
siteRating6OrHigher [] = []
siteRating6OrHigher ((Film title _ _ ratings):restOfFilms)
| above60 ratings = [title] ++ siteRating6OrHigher restOfFilms
| otherwise = siteRating6OrHigher restOfFilms
where above60 = any ((> 6) . snd)