Как объединить целые числа как строки в Haskell? - PullRequest
3 голосов
/ 05 марта 2012

Я хочу объединить строки в Haskell, а также целые числа из функции, как это:

arc 13 34 234 3

13 34 234 3 будут аргументами функции дуги, и я хочу выводить как

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

как строка, как я могу реализовать это?

Ответы [ 2 ]

7 голосов
/ 05 марта 2012

Как список чисел можно объединить в строку? Похоже, здесь может помочь какая-то функция [Int] -> String.

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

Итак, давайте добавим несколько скобок и "дугу" к этой строке.

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)"
5 голосов
/ 05 марта 2012

Если вы хотите выводить 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"
...