是否可以将Haskell中的列表转换为一系列元素?

时间:2015-03-09 14:21:07

标签: list haskell tuples

我有一部小电影"数据库"这只是一个列表,列表中的每个元素都是一个元组。

我想将字符串中的列表显示为易于阅读的格式,例如,列表中的每个数据项应显示如下:

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"]),
....
]

2 个答案:

答案 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
相关问题