2014-02-26 27 views
0

我有一个类型的电影如下:在Haskell中,如何将列表中的项目作为字符串返回?

type Film = (String, String, Int, [Rating]) 
type Rating = (String, Int) 

我的目标,是要在一个数据库电影的列表,像这样:

myDatabase :: [Film] 
myDatabase = [("Batman","Nolan",2012, [])] 

并且在功能showFilms,它返回整个列表作为一个字符串值。

我的代码如下:

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

任何帮助,为什么这正在发生,以及如何解决它将不胜感激。

我对这种语言相当陌生,所以如果它不是最优雅的做法,我们很抱歉。

在此先感谢。

+0

你能提供您想要的结果的例子吗? – Zeta

+0

期望的结果是这样的: “蝙蝠侠,诺兰,2012,[ 蝙蝠侠2,诺兰,2013,[]” – AlexJonBarry

回答

3

问题是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 
+1

感谢您的解释,真的帮助了我,特别是对字符串的理解。谢谢:) – AlexJonBarry

2

,下面的代码就足够了,因为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 
+0

感谢您的帮助,非常感谢。我意识到我可以使用这个节目,但是我应该以设计良好的方式格式化字符串,显然它不够好。谢谢:) – AlexJonBarry

+0

@AlexJonBarry:不客气。如果有一件事你应该记住这个答案,那就是'map'。如果您将Theodore的答案与'map'结合起来,您应该能够更快更轻松地创建未来结果。 – Zeta

相关问题