Haskell格式字符串输出“((x,y),”

时间:2018-11-23 12:11:34

标签: haskell

所以我试图输出点“(X,Y)\ n”的列表,但我无法使其正常工作。

值X和Y均为浮点数。我尝试了文本格式模块,但无法同时将其与Char和Float一起使用。

任何人都对如何使这项工作有想法吗?

最好的问候

已更新:

format_pts_string cs = [
    format ("(" % a % ", " % b % ")")
    | c <- cs]

2 个答案:

答案 0 :(得分:1)

从问题代码中,我想您希望将Double对的列表转换为String的列表,如评论中所述,您可能不需要使用Data.Text.Format包,因为基本功能show可以将其正确转换为String,如下所示:

format_pts_string::[(Double, Double)]->[String]
format_pts_string cs = map (\c-> (show c) ++ "\n") cs

或使用列表理解:

format_pts_string::[(Double, Double)]->[String]
format_pts_string cs =  [show c ++ "\n" | c <- cs]

此外,如果需要控制输出格式,可以使用++来串联String,下面是一个示例:

format_pts_string::[(Double, Double)]->[String]
format_pts_string cs = map formatPair cs
    where formatPair (a, b) = "(" ++ (show a) ++ ", " ++ (show b) ++ ")" ++ "\n"

如果您仍然喜欢使用模块文本格式,则可能需要启用OverloadedStrings语言扩展以将String转换为Format类型以进行通话{ {1}}的功能为:

format

或者不使用{-# Language OverloadedStrings #-} import Data.Text.Lazy (unpack) import Data.Text.Format (format) format_pts_string::[(Double, Double)]->[String] format_pts_string cs = [unpack $ format "({}, {})\n" (c::(Double, Double))| c <- cs] 语言扩展,而是在OverloadedStrings中使用formString,但是它很冗长,因为:

Data.String

答案 1 :(得分:0)

这是您的主意吗?

main = let ps = [
                  (1.0,1.0), 
                  (2.0,2.0), 
                  (3.0,3.0), 
                  (4.0,4.0), 
                  (5.0,5.0), 
                  (6.0,6.0)
                ]
        in mapM print ps

输出:

(1.0,1.0)
(2.0,2.0)
(3.0,3.0)
(4.0,4.0)
(5.0,5.0)
(6.0,6.0)