2014-02-26 28 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

相關問題