【问题标题】:Haskell: Convert String to [(String,Double)]Haskell:将字符串转换为 [(String,Double)]
【发布时间】:2019-11-24 02:23:08
【问题描述】:

我解析一个 XML 并得到一个这样的字符串:

"resourceA,3-resourceB,1-,...,resourceN,x"

我想将该字符串映射到元组列表 (String,Double) 中,如下所示:

[(resourceA,3),(resourceB,1),...,(resourceN,x)]

怎么可能做到这一点?我查看了地图功能以及拆分功能。我可以用“-”分割字符串,但除此之外……

这是我目前的代码:

split :: Eq a => a -> [a] -> [[a]]
split d [] = []
split d s = x : split d (drop 1 y) where (x,y) = span (/= d) s

这只是一个将我的字符串拆分成一个Stirng列表的函数,但是我不知道如何继续。 我想知道的是循环遍历我使用 split 方法创建的新列表,并为每个元素创建一个元组。我已经尝试过使用 map 函数,但我什至无法编译它

【问题讨论】:

  • 你能显示你的代码吗?你有什么远?您面临什么具体问题?
  • 欢迎来到 Stack Overflow!向我们展示您目前制作的代码。
  • 谢谢!我已经添加了我拥有的代码,以及我无法做到的@FyodorSoikin
  • 添加了@JeroenHeier
  • 编译尝试失败时,错误说明什么?

标签: haskell


【解决方案1】:

因此,在 Haskell 中,您不会真正改变任何值,而是根据您描述的字符串创建一个新的对列表,因此解决方案类似于以下内容:

import Data.List.Split


xmlList = splitOn "-" "resourceA,3-resourceB,4-resourceC,6"

commaSplit :: String -> [String]
commaSplit = splitOn ","

xmlPair :: [String] -> [(String, Double)] -- might be more efficient to use Text instead of String
xmlPair [x]    = [(\x' -> ((head x') :: String, (read (last x')) :: Double )) (commaSplit x)]
xmlPair (x:xs) = xmlPair [x] ++ xmlPair xs

main :: IO ()
main = mapM_ (\(a,b) -> putStrLn (show a++" = "++ show b)) (xmlPair $ xmlList)

这是我快速而肮脏的展示方式,但我相信总有人可以添加更详细的答案。

【讨论】:

  • 谢谢@ymg,问题是在我的问题上,xmlList 是这样的,而不是“resourceA,3-resourceB,1-,...,resourceN,x”,所以这段代码有效,但是我不知道如何更改您为我提到的列表中出现的数字添加双倍的数字 1
  • 不客气@JorgeFedericoKleinmanQuepfe,我刚刚意识到我的错误并更新了代码,希望它现在有用
  • 谢谢!对我很有帮助
猜你喜欢
  • 2023-01-28
  • 2018-07-13
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多