【问题标题】:Is there a simple function to make a string of a list of chars?是否有一个简单的函数来制作一个字符列表的字符串?
【发布时间】:2019-04-03 20:14:29
【问题描述】:

我想从一个字符列表中创建一个字符串 [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

但我觉得这可能更容易。

有没有一个简单的函数,比如 toString?我尝试使用一些我知道的函数,但它似乎不适用于我的代码,所以我继续使用 makeString。

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

【问题讨论】:

  • 字符串已经是 Haskell 中的字符列表。它只是一个类型别名。
  • 没关系,我明白我误解了你的问题。您想以特定方式格式化字符串,在每个字符和括号之间使用逗号?但是我不知道Steen是什么,还是Lettre(是Char的类型别名吗?)

标签: string list haskell char


【解决方案1】:

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

> "(" ++ intersperse ',' "123W55W3" ++ ")"
"(1,2,3,W,5,5,W,3)"

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

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

> "(" ++ intercalate ", " (map pure "123W55W3") ++ ")"
"(1, 2, 3, W, 5, 5, W, 3)"

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

newtype Lettre = Steen Char

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

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

【讨论】:

  • 嘿,感谢您的回答,但是当字符在列表中时,我该怎么做?
  • type String = [Char]; "foo" 只是 ['f', 'o', 'o'] 的语法糖。
  • 事实上,intersperse :: a -&gt; [a] -&gt; [a]intercalate :: [a] -&gt; [[a]] -&gt; [a] 是在Data.List 中定义的,并且对字符串起作用因为字符串只是Char 的列表。跨度>
  • 嘿,谢谢你的回答。可悲的是,代码告诉我它“无法将预期类型‘[Char]’与实际类型‘Char’匹配”
  • 这里的困难在于字符在列表中。而那部分只是在我的脑海中给出一个错误
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 2011-10-19
  • 2013-01-28
  • 2020-03-03
  • 2017-09-11
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多