Haskell:元组列表的字符串列表

lin*_*aon 1 haskell

我有以下字符串列表:

["1,AA,3","4,BB,6","7,CC,9"]
Run Code Online (Sandbox Code Playgroud)

我想得到像元组列表:

[(1,AA,3),(4,BB,6),(7,CC,9)]
Run Code Online (Sandbox Code Playgroud)

请帮忙.谢谢

编辑:

我尝试过类似的东西:

tuples (x:xs) = do
  foo ++ splitOn "," x
  tuples xs
  return foo
Run Code Online (Sandbox Code Playgroud)

这可能会给我列表如下:

"1,AA,3,4,BB,6,7,CC,9"
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将它转变为元组.

AA,BB,CC应该是字符串.

另外我想如果在列表中将是这样的:

["1,AA,3","4,,6","7,CC,9"]
Run Code Online (Sandbox Code Playgroud)

转变为

[(1,"AA",3),(4,6),(7,"CC",9)]
Run Code Online (Sandbox Code Playgroud)

Ser*_*hin 5

import Data.List.Split -- https://hackage.haskell.org/package/split

arrayToThreeTuple :: [String] -> [(Int,String,Int)]
arrayToThreeTuple = map (toThreeTuple.splitOn ",")
    where
      toThreeTuple :: [String] -> (Int, String, Int)
      toThreeTuple [a, b, c] = (read a :: Int, b, read c)
      toThreeTuple _ = undefined
Run Code Online (Sandbox Code Playgroud)

一点解释:在给定的子串上splitOn拆分String,例如

GHCI List.Split> splitOn "," "1,AA,3"
["1","AA","3"]
Run Code Online (Sandbox Code Playgroud)

接下来read将a String转换为不同的类型,可以写入read "1" :: Int或ghc可以通过类型签名推断它(请参阅参考资料read c).

下一行是"catch all line",它缓存所有其他模式[a,b,c],表示_并导致运行时错误(undefined).