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