我有一部小电影"数据库"这只是一个列表,列表中的每个元素都是一个元组。
我想将字符串中的列表显示为易于阅读的格式,例如,列表中的每个数据项应显示如下:
Casino Royale
Daniel Craig, Eva Green
2006
Garry, Dave
Titanic
Leonardo DiCaprio, Kate Winslet
1997
Zoe, Amy
以下是我正在使用的代码:
type Title = String
type Actors = [String]
type Year = Int
type Fans = [String]
type Film = (Title, Actors, Year, Fans)
type Database = [Film]
testDatabase :: Database
testDatabase = [("Casino Royale", ["Daniel Craig", "Eva Green"], 2006,["Garry", "Dave"]),
("Titanic", ["Leonardo DiCaprio", "Kate Winslet"], 1997, ["Zoe", "Amy"]),
....
]
答案 0 :(得分:1)
一种方法是为Show
编写自己的Film
实例。但是你需要启用一些扩展:
{-#LANGUAGE TypeSynonymInstances#-}
{-#LANGUAGE FlexibleInstances#-}
{-#LANGUAGE OverlappingInstances#-}
然后创建Show
的实例:
instance Show Film where
show (t,a,y,f) = t ++ "\n" ++ actors ++ "\n" ++ (show y) ++ "\n" ++ fans
where actors = intercalate ", " a
fans = intercalate ", " f
ghci
演示:
λ> mapM_ (\x -> (putStrLn $ show x) >> putStrLn "") testDatabase
Casino Royale
Daniel Craig, Eva Green
2006
Garry, Dave
Titanic
Leonardo DiCaprio, Kate Winslet
1997
Zoe, Amy
我建议你将(a,b,c,d)
类型分解为记录数据结构。这是更可取的。
答案 1 :(得分:0)
我能够在原帖的评论中使用@ karakfa的方法产生我想要的结果:
pp :: Film -> String; pp (t,a,y,f) = i "\n" [t, i ", " a, show y, i ", " f] where i x = intercalate x