haskell - Haskell 中的编号输出行

标签 haskell

我想显示任意类型列表的内容,每行一个元素,从 1 开始编号,如下所示:

字符串示例:

> bs "Hallo"
1. 'H'
2. 'a'
3. 'l'
4. 'l'
5. 'o'

整数示例
> bs [5,6,1,2]
1. 5
2. 6
3. 1
4. 2

元组示例
> bs [(4,"Test"),(3,"Aye"),(5,"Fives")]
1. (4,"Test")
2. (3,"Ayes")
3. (4,"Fives)

我发现这是一种解决方案:
bs' :: Show a => [a] -> Integer -> IO ()
bs' [] _ = return ()
bs' (x:xs) y = do
  putStrLn  $ (show y) ++ ". " ++ (show x)
  bs' xs $ succ y

bs x = bs' x 1
  • 由于我是 Haskell 的绝对初学者,我想知道解决这个问题的“最佳”方法是什么?我是在正确的道路上还是只是简单的“坏”Haskell。
  • 如何在没有 '' 的 String 示例中输出 Chars 并且仍然能够输出具有 Show 实例的任何类型?
  • 我想从不同的角度了解解决此任务的其他方法,例如:可读性、效率、代码重用。

  • 我也这样做了,发现它更奇怪(但有点酷):
    bs' :: Show a => [(Integer,a)] -> IO ()
    bs' [] = return ()
    bs' ((x1,x2):xs) = do
      putStrLn $ (show x1) ++ ". " ++ (show x2)
      bs' xs
    
    bs x = bs' (zip [1..] x)
    

    我已经完成了大约 25 年的命令式编程,并且对学习新东西非常感兴趣。同时,如果在 Haskell 中编写代码感到难以置信的“奇怪”,我仍然无法想象使用这种“来自月球的疯狂语言”如何完成一个大项目:)

    编辑:我要感谢大家。我选择一个答案,因为我必须这样做,但所有答案都非常有帮助!我还想说,我拥有的最佳解决方案是因为“在真正的问题中”我不得不跳过一些列表元素,并且在使用 zip 方法时编号出错。阅读完所有答案后,我很确定,即使如此,解决方案还是首先过滤列表,然后压缩映射输出函数。

    最佳答案

    还有Text.Printf ,如果您怀旧 printf :

    import Text.Printf
    
    bs :: Show a => [a] -> IO ()
    bs = sequence_ . zipWith (\n x -> printf "%d. %s\n" n (show x)) [(1 :: Int)..]
    

    或者如果您不想使用 printf :
    bs xs = sequence_ $ zipWith (\n x -> mapM_ putStr [show n, ". ", show x, "\n"]) [1..] xs
    

    这些都不是非常惯用的,我认为大多数人会创建一个返回字符串的纯函数,然后在必要时打印它:
    bs' xs = unlines $ zipWith (\n x -> show n ++ ". " ++ show x) [1..] xs
    
    bs xs = putStr (bs' xs)
    

    关于haskell - Haskell 中的编号输出行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24824457/

    相关文章:

    haskell - Haskell 中的句柄更安全?

    haskell - 你如何在 Haskell 的实例方法中应用函数约束?

    haskell - Haskell 中类型的余积(不相交并集)的语法是什么?

    list - 如何找出给定元素所在的组的大小?

    haskell - 消失的应用程序?

    list - 连接 (++) 列表而不重叠

    list - 根据元素索引修改列表的元素

    windows - Haskell 中 System.Info "os"函数的可能值是多少?

    haskell - 使用 HUnit 测试 double 的 haskell 相等性?

    haskell - 正在解析网络.HTTP 'user error (https not supported)'