2014-02-24 74 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

查看完整的编辑。 –