一个类型安全的替代方案Text.Printf
是格式化包。Text.Printf.printf
不确保在编译时格式化参数的数量与参数的数量及其类型一致。阅读 Chris Done 的文章printf 有什么问题?举些例子。
一个示例用法:
{-# LANGUAGE OverloadedStrings #-}
import Formatting
map (uncurry $ formatToString ("Value: " % int % " " % int)) [(1,100), (2,350), ...]
map (\(x,y) -> formatToString ("Value: " % int % " " % int) x y) [(1,100), (2,350), ...]
它需要 GHC 扩展OverloadedStrings才能正常工作。
虽然formatToString ("Value: " % int % " " % int)
有 type Int -> Int -> String
,但 uncurrying 它给出了(Int, Int) -> String
输入类型与列表中的元素匹配的类型。
重写过程可以分解;假设f
= formatString ("Value: " ...)
,
map (\(x,y) -> f x y) ≡ map (\(x,y) -> uncurry f (x,y)) ≡ map (uncurry f)
也就是说,首先你 uncurry f 来实现接受元组的函数,然后你执行一个常规的Eta 转换,因为\(x,y) -> uncurry f (x,y)
它等同于simple uncurry f
。要打印结果中的每一行,请使用mapM_
:
mapM_ (putStrLn . uncurry $ formatToString ...) [(1,100), (2,350), ...]
如果您运行hlint YourFile.hs,则会向您推荐这些重写。