在Haskell中有没有一种方法可以将print与printf的格式一起使用?

在Haskell中有没有一种方法可以将print与printf的格式一起使用?,haskell,functional-programming,Haskell,Functional Programming,为了在Haskell获得更多经验,我开始使用print和printf 我想尝试打印一个数组(好的,有几个,但这只是一个开始),我想使用格式“%+.4f”,这意味着我将得到: +2.1234 or -1.2345 然而,我注意到使用printf打印数组非常困难,所以我尝试切换到打印。这样打印列表似乎更容易,但我不确定如何使用与printf相同的格式打印列表中的元素 我的列表如下所示: [-1.2, 2.3, 4.7, -6.850399] 您可以使用数值模块中的功能。例如,“%+.4f”可以表

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

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

+2.1234 or -1.2345
然而,我注意到使用printf打印数组非常困难,所以我尝试切换到打印。这样打印列表似乎更容易,但我不确定如何使用与printf相同的格式打印列表中的元素

我的列表如下所示:

[-1.2, 2.3, 4.7, -6.850399]

您可以使用
数值
模块中的功能。例如,“%+.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
来显示输出。)

两个变量应该使用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]]

这实际上并不像“%+.4f”那样,因为它不会为正数显示“+”。有没有办法将其应用到列表中?比如说[-1.2,2.3],[4.7,-6.899]]。我很确定map不会起作用,因为我会将打印的内容映射到一些列表中。我找到了一个解决方案,但它实际上并不使用您的实现。不过,我仍有兴趣了解如何打印我在上面发布的列表(使用您的任何解决方案)。使用
mapM(mapM)(printf…)
打印列表。