如何在 Haskell 中将整数拼接为字符串?

6
我想在Haskell中拼接字符串,也可以从函数中获取整数,像这样:

arc 13 34 234 3

13 34 234 3 将成为弧函数的参数,我希望输出结果为

"arc(13, 34, 234, 3)"

作为字符串,我该如何实现这个?

1
你确定你的 arc 函数应该有 4 个 Int 参数吗?也许使用 [Int] 更方便? - ДМИТРИЙ МАЛИКОВ
2个回答

9

如何将数字列表连接成字符串?看起来这里可以使用一些 [Int] -> String 函数来帮助。

> concat . intersperse ", " . map show $ [13, 34, 234, 3]
"13, 34, 234, 3"

因此,让我们给这个字符串添加一些括号和“arc”。
import Data.List (intersperse)

arc :: [Int] -> String
arc nums = "arc(" ++ (concat . intersperse ", " . map show $ nums) ++ ")"

然后我们得到了答案。

> arc  [13, 34, 234, 3]
"arc(13, 34, 234, 3)"

如果您确实需要带有签名 Int -> Int -> Int -> Int -> String 的函数:

arc' :: Int -> Int -> Int -> Int -> String
arc' a1 a2 a3 a4 = "arc(" ++ (concat . intersperse ", " . map show $ [a1,a2,a3,a4]) ++ ")"

> arc' 13 34 234 3
"arc(13, 34, 234, 3)"

6

如果需要输出 String,通常的技巧是创建一个 ShowS,它只是 String -> String 的另一个名称。

showsArc :: Int -> Int -> Int -> Int -> ShowS
showsArc a b c d = showString "arc" . shows (a, b, c, d)

>>> showsArc 13 34 234 3 []
"arc(13,34,234,3)"

函数调用末尾的[]只是一个空字符串,它让你无需担心O(N)的字符串连接,就可以将数据附加到末尾。
>>> showsArc 13 34 234 3 " and some extra text"
"arc(13,34,234,3) and some extra text"

我尝试了这个,但是ghci报错:Arc.hs:30:1: 无效的类型签名:Arc :: Int -> Int -> Int -> Int -> ShowS 应该是这种形式:<变量> :: <类型> - Mahmut Bulut
5
在Haskell中,函数(或值)的名称不能以大写字母开头,例如Arc就是一个无效的函数名。(只有构造函数、类型、模块和类可以以大写字母开头命名。) - Dietrich Epp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接