有没有办法在Haskell中使用printf格式的print?

时间:2016-04-16 00:38:19

标签: haskell functional-programming

为了获得在Haskell的进一步经验,我开始使用print和printf。

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

+2.1234 or -1.2345

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

我的列表看起来像这样:

[-1.2, 2.3, 4.7, -6.850399]

2 个答案:

答案 0 :(得分:3)

两种变体应该使用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)

您可以使用 try{ ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG,90, bytes); imgUri = "photo_" + System.currentTimeMillis() + ".jpg"; File appDirectory = new File(Environment.getExternalStorageDirectory(),"CountDotsAppImages"); appDirectory.mkdirs(); File destination = new File(Environment.getExternalStorageDirectory(),"CountDotsAppImages/"+imgUri); FileOutputStream fo; try { destination.createNewFile(); fo = new FileOutputStream(destination); fo.write(bytes.toByteArray()); fo.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 模块中的功能。例如"%+。4f"可以表示为

Numeric

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

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来显示输出。)