繁体   English   中英

在Haskell中,如何以字符串形式返回列表中的项目?

[英]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

除非您想要特定的格式,否则以下代码就足够了,因为StringIntShow实例:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM