【问题标题】:Haskell - Formatting issuesHaskell - 格式化问题
【发布时间】:2013-04-04 12:37:53
【问题描述】:

这是我必须显示数据库信息的当前代码,但是当打印出来时,阅读起来不是很清楚..

type Title = String
type Cast = String
type Year = Int
type Fans = String

type Film = (Title, [Cast], Year, [Fans])
type Database = [Film]

testDatabase :: Database
testDatabase = [("Casino Royale", ["Daniel Craig", "Eva Green", "Judi Dench"], 2006, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]),
    ("Cowboys & Aliens", ["Harrison Ford", "Daniel Craig", "Olivia Wilde"], 2011, ["Bill", "Jo", "Garry", "Kevin", "Olga", "Liz"]),     
        ("Catch Me If You Can", ["Leonardo DiCaprio", "Tom Hanks"], 2002, ["Zoe", "Heidi", "Jo", "Emma", "Liz", "Sam", "Olga", "Kevin", "Tim"])]      

运行此函数时:

displayAllFilms :: Database ->[(Title, [Cast], Year, [Fans])]
displayAllFilms [] = []
displayAllFilms ((i, j, k, l): xs)
        |l == [] = (i, j, k, []) : displayAllFilms xs
        |otherwise = (i, j, k, l) : displayAllFilms xs

它打印这个:

[("皇家赌场",["丹尼尔克雷格","伊娃格林","朱迪丹奇"],2006 ["加里","戴夫","佐伊","凯文","艾玛"]) ,("牛仔与外星人",["哈里森福特","丹尼尔克雷格","奥利维亚王尔德"],2011,["比尔","乔","加里","凯文","奥尔加","利兹"]),(“如果你能抓住我”,[“莱昂纳多·迪卡普里奥”,“汤姆·汉克斯”],2002,[“佐伊”,“海蒂”,“乔”,“艾玛”,“莉兹”,“山姆” ","奥尔加","凯文","蒂姆"])]

这显然是不可读的:有没有办法让每个电影信息(在这种情况下)打印在单独的行上,即。使用 /n 符号?

非常感谢您的帮助,在此先感谢! :)

【问题讨论】:

    标签: database function haskell formatting higher-order-functions


    【解决方案1】:
    displayAllFilms :: Database -> IO ()
    displayAllFilms db = mapM_ print db
    

    这是如何工作的?

    • print 定义为

      print :: Show a => a -> IO ()
      print x = putStrLn (show x)
      
    • 如何解释mapM_?...你知道map 是做什么的,是吗?给定一个函数和一个列表,它将函数应用于列表的每个元素,并返回一个结果列表。

      map 采用 a -> b 类型的函数,但 mapM_ 采用 a -> IO b 类型的函数(我正在简化)。 IO 表示该函数可能会执行一些 i/o(在这种情况下:写入屏幕,这就是 print 所做的)。

      mapM_ 将所有这些单独的 i/o 片段连接在一起,并确保它们以正确的顺序发生。

    注意事项:

    • 您原来的 displayAllFilms 实际上并没有做任何事情:输出与输入相同,打印到屏幕上的唯一原因是您从 ghci 提示符运行它
    • 拼写为\n,而不是/n(虽然我没有明确使用它,因为print/putStrLn会自动在末尾添加换行符)

    【讨论】:

    • 感谢帮助,澄清一下,这部分代码是做什么的?:displayAllFilms db = mapM_ print db
    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多