有一个简单的函数可以使一个字符串组成一个字符列表吗?

Elz*_*ger -1 string haskell list char

我想从字符列表中创建一个字符串[Lettre]

例如,['1','2','3','W','5','5','W','3']应打印为(1、2、3,W,5 ,5,W,3)

现在,我用

data Lettre = Steen Char

makeString :: [Lettre] -> String
makeString [] = ""
makeString [Steen(x)] = x:[]
makeString (Steen(x):xs) = (x:", ") ++ makeString xs
Run Code Online (Sandbox Code Playgroud)

但我觉得这样可能会更容易。

是否有一个简单的函数,例如toString?我尝试使用一些我知道的函数,但是它似乎不适用于我的代码,因此我继续使用makeString。

非常感谢任何可以帮助我的人:)

che*_*ner 7

给定一个字符列表,您可以使用intersperse,但是仅允许使用单字符分隔符。

> "(" ++ intersperse ',' "123W55W3" ++ ")"
"(1,2,3,W,5,5,W,3)"
Run Code Online (Sandbox Code Playgroud)

对于像这样的多字符分隔符", ",可以使用intercalate,但是然后需要一个列表String,而不是一个列表Char

解决方案是将每个字符提升为字符串,然后使用intercalate

> "(" ++ intercalate ", " (map pure "123W55W3") ++ ")"
"(1, 2, 3, W, 5, 5, W, 3)"
Run Code Online (Sandbox Code Playgroud)

我假设输入是一个实际的[Char]/ String值;如果您实际上有一些更复杂的Char包装器,例如

newtype Lettre = Steen Char
Run Code Online (Sandbox Code Playgroud)

从您的尝试可以推断出,请改用类似

makeString :: [Lettre] -> String
makeString xs = "(" ++ intercalate ", " [[x] | Steen x <- xs] ++ ")"
Run Code Online (Sandbox Code Playgroud)