Haskell转换列表到元组列表

nic*_*las 7 haskell tuples list

我有这样的清单

["peter","1000","michell","2000","kelly","3000"]
Run Code Online (Sandbox Code Playgroud)

我想转换成

[("peter",1000),("michell", 2000),("kelly",3000)]
Run Code Online (Sandbox Code Playgroud)

请帮忙.谢谢.

ony*_*ony 14

cnv :: [String] -> [(String, Integer)]
cnv [] = []
cnv (k:v:t) = (k, read v) : cnv t
Run Code Online (Sandbox Code Playgroud)

如果你想处理奇数长度,只需cnv [x] =在最后一个之前添加变量

  • 不完全:在`k:v:t`中,`k`是头部,而'v:t`是尾部.因此,`k:v:t`将列表的前两项放入`k`和`​​v`,将剩余的尾放在`t`中.你的代码有两个明显的问题:(a)`(x,y)`有类型`(String,String)`,而不是`(String,Integer)`; (b)在转换xs之前没有冒号.(你不能只做`:xs`,因为你需要`[(String,Integer)]`但是'xs`有类型`[String]`.)另外,格式化提示:缩进行,有四个空格到获取代码块(或选择代码并单击"101010"按钮),并使用反引号环绕代码片段(\`...代码... \`). (3认同)
  • @Antal SZ是对的.`(k:v:t)`相当于`(k:(v:t))`因为在``GHC.Types`中声明`infixr 5:`(http://hackage.haskell.org/packages /archive/ghc-prim/0.1.0.0/doc/html/src/GHC-Types.html)(以及`data [] a = [] | a:[a]`会告诉你`(v的含义) :t)`或`[]`). (2认同)

Tra*_*own 8

ony的解决方案有点短,但这是一个使用splitEvery非常方便的split的非递归版本:

cnv = map (\[name, amount] -> (name, read amount :: Int)) . splitEvery 2
Run Code Online (Sandbox Code Playgroud)

这里的步骤(对我来说至少比)在递归版本中更清晰一些.

  • 这绝对是更自然的.分裂的图书馆没有得到足够的爱.这太糟糕了,因为它非常有用. (2认同)