【问题标题】:Haskell - Printing Multiple Non-String VariablesHaskell - 打印多个非字符串变量
【发布时间】:2014-01-07 07:45:40
【问题描述】:

我正在编写一个程序,它从命令行读取两个整数,将它们加倍,然后将它们打印出来。所以我的程序读入 Args,将它们转换为 Ints,然后将它们加倍。我的问题是关于输出:在 Python 中,我可以写:

>>>a = 9
>>>b = 10
>>>print a,b
9 10

这给了我令人满意的输出。在 Haskell 中,有一个类似的 print 语句来打印给定的变量 - 例如

Prelude> let a = 10
Prelude> print a
10

我想知道是否有一个等效于 python print a,b 的 Haskell,所以我可以一次打印多个变量。否则,我必须将加倍的 Ints 转换回字符串,然后写入:
putStrLn (doubledint1 ++ " " ++ doubledint2)

有没有一种打印多个变量的方法比手动转换为字符串,然后在它们的连接上调用 putStrLn 的费力方法更有效?

【问题讨论】:

    标签: python haskell output


    【解决方案1】:

    您可以使用mapM_,也可以使用printputStr.show

    Prelude> mapM_ print [a, b]
    9
    10
    
    mapM_ (putStr . show) [a, b]
    910Prelude>
    

    input-output section of learn you a haskell

    你可以得到空格和换行:

    Prelude> let pylike_print ints = mapM_ (\x -> putStr $ (show x) ++ " ") ints >> putStr "\n"
    Prelude> pylike_print [9, 10]
    9 10
    

    【讨论】:

    • 我有两种不同的类型,BookCreator。如何打印出warAndPeaceBookleoTolstoy 谁是Creator?我在main::IO() 中尝试了mapM_ print (warAndPeace, leoTolstoy),但它只打印leoTolstoy
    【解决方案2】:

    您可以使用 show 将列表中的每个 int 转换为字符串,并使用 intercalate 创建连接的字符串:

    import Data.List
    
    let ints = [9, 10]
    print $ intercalate " " (map show ints)
    

    正如@raymonad 在 cmets 中指出的那样,如果您不想引用输出字符串,则应使用 putStrLn 而不是 print

    【讨论】:

    • 那么你可能想要putStrLnprint 你会得到一个带引号的字符串)。
    • 使用 intercalate 需要导入什么?
    • 您也可以使用 Prelude 中的unwords 来代替intercalate " "
    【解决方案3】:

    或者,您可以使用printf:(来自Text.Printf

    printf "%d %d" a b
    

    【讨论】:

    • 这具有在 a 和 b 是不同类型的情况下工作的优势。
    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多