我得到了这个项目做Im类型卡住了。我知道这不是太复杂,但我用完了想法。Haskell从列表中平均排序
那么我所定义的那些类型:
-- Types
type Title = String
type Director = String
type Year = Int
type Mark = Int
type Rating = (String, Int)
-- Define Film type here
type Film = (Title, Director, Year, [Rating])
-- Define database type here
type Database = [Film]
testDatabase :: [Film]
testDatabase =
[("Casino Royale", "Martin Campbell", 2006, [("Garry",8),("Dave", 0)])
,("Blade Runner", "Ridley Scott", 1982, [("Amy",5),("Dave", 9]),
,("The Fly", "David Cronenberg", 1986, [("Fred",7),("Dave", 4)])
]
所以现在我有显示平均评分,之后我有要显示的他们的平均值等于或高于6
薄膜你能给我一些提示/指导吗?谢谢!
UPDATE:
感谢您的答复,而是因为我已经做了该项目的一半,我认为其后期更改数据类型,因为我不得不重新考虑一切。
我做了一个尝试,但它不工作的显示功能,我不知道为什么:
filmRating :: [Rating] -> Int
filmRating rating = div (sum [r | (_,r) <- rating]) (length rating)
averageFilm :: Film -> Int
averageFilm (t, d, y, r) = filmRating r
sixOrHigher :: Int -> Bool
sixOrHigher average
| average <= 6 = True
| otherwise = False
displayAverage :: Database -> String
displayAverage database = displayFilms (filter ((sixOrHigher (averageFilm)) database))
UPDATE2:
我发现的脑杀小时后的溶液并发誓一切:)
再次感谢大家!
这:
averageFilm :: Film -> Int
averageFilm (t, d, y, r) = filmRating r
averageFilms :: Database -> [Int]
averageFilms database = map (averageFilm) database
sixOrHigher :: Int -> Bool
sixOrHigher average
| average <= 6 = True
| otherwise = False
checkAllIfHigher :: Film -> Bool
checkAllIfHigher film = (sixOrHigher (averageFilm film))
displayAverage :: Database -> String
displayAverage database = displayFilmsAverage (filter (checkAllIfHigher) database)
displayFilmsAverage :: Database -> String
displayFilmsAverage database = concat(map (displayFilmAverage) database)
第一步:写一个函数':: Film - > [Rating]'来获得电影的所有等级。从这个角度来看,一个函数':: [评级] - >双',使平均。然后您可以查看提供的排序功能。 – progo
查看'map'函数[here](http://hackage.haskell.org/package/base-4.6.0.1/docs/Prelude.html#v:map)和'sum :: Num a => [a] - > a'和'length :: [a] - > Int'函数。稍后,您需要'filter'函数[here](http://hackage.haskell.org/package/base-4.6.0.1/docs/Prelude.html#v:filter)来选择电影。您可以在[hoogle](http://www.haskell.org/hoogle/)上搜索功能。 – AndrewC
您的'Mark'类型同义词不会在任何地方使用 - 您可能打算在定义'Rate'时使用它吗? –