【问题标题】:Is there a way to use print with the formats of printf in Haskell?有没有办法在 Haskell 中使用 printf 格式的 print?
【发布时间】:2016-04-16 00:38:18
【问题描述】:

为了获得更多 Haskell 经验,我开始使用 print 和 printf。

我想尝试打印一个数组(嗯,有几个,但这只是一个开始),我想使用"%+.4f" 格式,这意味着我会得到:

+2.1234 or -1.2345

但是我注意到使用 printf 打印数组非常困难,因此我尝试切换到打印。以这种方式打印列表似乎更容易,但我不确定如何使用与 printf 相同的格式打印列表的元素。

我的列表如下所示:

[-1.2, 2.3, 4.7, -6.850399]

【问题讨论】:

    标签: haskell functional-programming


    【解决方案1】:

    两个应该做同样事情的变体,使用 printf 的两种可能的返回类型:

    putStrLn $ concatMap (printf "%+.4f\n") [-1.2, 2.3, 4.7, -6.850399]
    mapM_ (printf "%+.4f\n") [-1.2, 2.3, 4.7, -6.850399]
    

    编辑:用于深度遍历两个列表:

    putStrLn $ (concatMap . concatMap) (printf "%+.4f\n") [[-1.2, 2.3], [4.7, -6.850399]]
    (mapM_ . mapM_) (printf "%+.4f\n") [[-1.2, 2.3], [4.7, -6.850399]]
    

    【讨论】:

    • 有没有办法可以将其应用于列表列表?例如 [[-1.2, 2.3], [4.7, -6.899]]。我很确定 map 不会工作,因为我会将打印到某些列表的内容映射。
    • 我找到了一个解决方案,但它实际上并没有使用您的实现。不过,我仍然有兴趣了解如何打印我在上面发布的列表列表(使用您的任何解决方案)。
    • 使用mapM_ (mapM_ (printf ...)) 打印列表列表。
    【解决方案2】:

    您可以使用Numeric 模块中的函数。例如“%+.4f”可以表示为

    formatFloat x = showFFloat (Just 4) x ""
    

    然后您可以将此函数映射到您的列表上,以获取字符串列表。

    > map formatFloat [-1.2, 2.3, 4.7, -6.850399]
    ["-1.2000","2.3000","4.7000","-6.8504"]
    

    (因为这些已经是字符串,所以我会使用 putStrLn 而不是 print 来显示输出。)

    【讨论】:

    • 这实际上并没有像“%+.4f”那样做,因为它不会显示正数的“+”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多