簡體   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