[英]In Haskell, how to return items in a list as a String?
我的电影类型如下:
type Film = (String, String, Int, [Rating])
type Rating = (String, Int)
我的目标是在数据库中保存电影列表,如下所示:
myDatabase :: [Film]
myDatabase = [("Batman","Nolan",2012, [])]
然后在函数showFilms上,它将整个列表作为String值返回。
我的代码如下:
showFilms :: [Film] -> String
showFilms [] = []
showFilms (x:xs) = output: showFilms xs
where [[output]] = title ++ director ++ [(show year)] ++ [(show ratings)]
film = [film | (film) <- [x]]
title = [title | (title,director,year,ratings) <- film]
director = [director | (title,director,year,ratings) <- film]
year = [year | (title,director,year,ratings) <- film]
ratings = [ratings | (title,director,year,ratings) <- film]
它在WinGHCi上编译,但是当我输入除空数据库之外的任何内容时,都会出现此错误:
*** Exception: HaskellCW.hs:32:29-95: Irrefutable pattern failed for pattern [[output]]
对于为什么发生这种情况以及如何解决它的任何帮助将不胜感激。
我对这门语言还很陌生,所以如果这不是最优雅的方式,请您道歉。
提前致谢。
问题是title ++ director ++ [(show year)] ++ [(show ratings)]
计算为字符串列表,这是字符列表,但是模式[[output]]
仅匹配如果列表中只有一个字符串,并且该字符串仅包含一个字符。
在我看来,您想要做的就是将x
转换为字符串。 为什么不这样做
showFilms :: [Film] -> String
showFilms [] = []
showFilms (x:xs) = output ++ showFilms xs
where output = title ++ director ++ (show year) ++ (show ratings)
(title, director, year, ratings) = x
除非您想要特定的格式,否则以下代码就足够了,因为String
和Int
是Show
实例:
showFilms :: [Film] -> String
showFilms = show
注意,您还可以从字符串中读取数据库,因为这些类型也是Read
实例:
readFilms :: String -> [Film]
readFilms = read
如果您想要特定的格式,最好先考虑单个电影的Film -> String
,然后将该函数映射到您的数据库中:
showFilm :: Film -> String
showFilm (title, director, year, ratings)
= title ++ " " ++ director ++ " [" ++ (show year) ++ "] [" ++ (show ratings) ++ "]"
showFilms' :: [Film] -> String
showFilms' = unlines . map showFilm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.