【问题标题】:Haskell : list comprehensionHaskell:列表理解
【发布时间】:2022-01-08 14:56:43
【问题描述】:

如何在不重复 (c !! x) 的情况下编写此代码,其中 x = [0..7],使用列表理解更好,但我不知道如何编写它

show (EOBoard f c r) = "EOBoard\n" ++ "Foundations "
   ++ show f ++ "\n" ++ "Columns \n" 
   ++ show (c!!0) ++ "\n" ++ show (c!!1) ++ "\n"
   ++ show (c!!2) ++ "\n" ++ show (c!!3) ++ "\n"
   ++ show (c!!4) ++ "\n" ++ show (c!!5) ++ "\n"
   ++ show (c!!6) ++ "\n" ++ show (c!!7) ++ "\n"
   ++ "Reserves " ++ show r

【问题讨论】:

  • “x = [0..7] 在哪里”应该是什么意思?
  • C 是一个包含 7 个元素的列表。我想在新行中打印每一个
  • 如果您假设列表具有(至少)8 个元素,那么它们可能应该存储为 EOBoard 值的单独元素,而不是必须遍历链表 8 次。
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?

标签: haskell list-comprehension


【解决方案1】:

让我们首先摆脱所有这些手动换行符。

import Data.List

show (EOBoard f c r) = intercalate "\n" $
  [ "EOBoard"
  , "Foundations " ++ show f
  , "Columns" 
  , show (c!!0)
  , show (c!!1)
  , show (c!!2)
  , show (c!!3)
  , show (c!!4)
  , show (c!!5)
  , show (c!!6)
  , show (c!!7)
  , "Reserves " ++ show r]

注意:如果您也想在末尾换行,请使用unlines 而不是intercalate

正如您所注意到的,有一个相当重复的部分。此外,那些!! 应用程序有点贵。列表推导解决了这两个问题,但我会改用 map

show (EOBoard f c r) = intercalate "\n" $
  [ "EOBoard"
  , "Foundations " ++ show f
  , "Columns" ] ++
  map show c ++
  ["Reserves " ++ show r]

(如果您愿意,map show c 可以替换为 [show x | x <- c]。)

还有一些有趣的东西; Show 真的不适合漂亮的打印。 show 不应插入换行符。您可能实际上想编写一个自定义的漂亮打印函数。

【讨论】:

  • unlines ["1","2"] ==> "1\n2\n" 但 OP 代码没有尾随换行符。所以它是intercalate
  • @WillNess,我没有意识到unlines 在这方面与unwords 不同。谢谢。
【解决方案2】:

你写的相当于

show (EOBoard f c r) = "EOBoard\n" ++ "Foundations "
   ++ show f ++ "\n" ++ "Columns \n" ++
   ++ concat [ show s ++ "\n" | s <- take 8 c]
   ++ "\n" ++ "Reserves " ++ show r

相当于

show (EOBoard f c r) = "EOBoard\n" ++ "Foundations "
   ++ show f ++ "\n" ++ "Columns \n" ++
   ++ [ ch | s <- take 8 c, ch <- show s ++ "\n" ]
   ++ "\n" ++ "Reserves " ++ show r

或者,使用concat more 而不是内联它,它相当于

show (EOBoard f c r) = concat (
   [ "EOBoard\n", "Foundations ", show f, "\n", "Columns \n" ]
   ++ [ show s ++ "\n" | s <- take 8 c]
   ++ ["\n" , "Reserves " , show r] )

通常使用$ 运算符编写,如

show (EOBoard f c r) = concat $
   [ "EOBoard\n", "Foundations ", show f, "\n", "Columns \n" ]
   ++ [ show s ++ "\n" | s <- take 8 c]
   ++ ["\n" , "Reserves " , show r]

【讨论】:

  • 这次我认为unlines 可能是要走的路,或者更普遍的是intercalate
  • @dfeuer 毫无疑问,LC 确实重新实现了它,但 OP 确实要求提供 LC 解决方案,所以。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2018-04-27
  • 2021-01-12
  • 2019-08-20
相关资源
最近更新 更多