2012-03-05 35 views
2

私はHaskellの内の文字列を連結すると、このような関数から の整数:Haskellで文字列として整数を連結する方法は?

arc 13 34 234 3 

13 34 234 3は、アーク関数の引数となり、私は文字列として

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

ような出力をしたいですこれをどのように実装できますか?

+1

あなたはあなたの 'arc'関数は4' Int'引数を持つべきであることを確認していますか?たぶん[Int]はもっと使えるでしょうか? 30::1: 無効な型シグネチャ:˙Arc.hsを –

答えて

4

Stringを出力する場合は、String -> Stringの別の名前であるShowSを作成するのが典型的な方法です。

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" 
+0

は、私はこれを試みたが、GHCiのは、与えアーク::のInt - >のInt - >のInt - >のInt - > フォーム ::の –

+5

˙ であるべき示しています大文字で始まる関数(または値)を指定することはできません: 'Arc'はHaskellの無効な関数名です。 (コンストラクタ、型、モジュール、およびクラスは、大文字で始まる名前のみです。) –

6

数字のリストはどのようにして文字列に連結できますか?いくつかのように見える[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)" 
関連する問題