Haskell:列表理解

0 haskell list-comprehension

我怎样才能编写这段代码而不重复(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
Run Code Online (Sandbox Code Playgroud)

dfe*_*uer 5

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

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]
Run Code Online (Sandbox Code Playgroud)

注意:如果您也想在末尾换行,请使用unlines代替intercalate

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

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

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

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