【问题标题】:How to convert a list of Strings to a list of tuples? (Haskell)如何将字符串列表转换为元组列表? (哈斯克尔)
【发布时间】:2019-09-26 23:05:32
【问题描述】:

我有一个字符串列表:学生、他们在某门课程中的成绩、课程名称。我需要将列表中的每个字符串转换为元组,因为它同时包含字符串和整数。

[“PHL 220 A 3 Ada Lovelace A”、“PHL 220 A 3 格蕾丝料斗 C”、“THE 105 A 3 格蕾丝料斗 B+”]

[("PHL",220,"A",3,"Lovelace, Ada",4.0), ("THE",105,"A",3,"Hopper, Grace",3.33)]

我试过了,但它不起作用。

listToTuples :: [[String]] -> [(String | Integer)]
    listToTuples = map listToTuples

我对 Haskell 很陌生,所以语法很混乱。

【问题讨论】:

  • “它不起作用”是什么意思?提供错误信息。

标签: list haskell tuples


【解决方案1】:

您提供的尝试中有很多错误。幸运的是,这些错误大多是语法错误,您正确地解决了问题。

让我们逐行进行:

listToTuples :: [[String]] -> [(String | Integer)]

这几乎是正确的,但是:

  • 您已将输入类型指定为[[String]] — 即字符串列表的列表。但是,您的输入实际上是一个字符串列表——即[String]
  • (String | Integer) 不是正确的 Haskell 语法。正确的语法是(String, Integer)。此外,您的输出类型实际上是字符串、整数、字符串、整数、字符串和整数的元组,转换为(String, Int, String, Int, String, Int)。 (如果您愿意,可以使用Integer,但这不是必需的;如果您有兴趣,请在 Haskell 中搜索 IntInteger 之间的区别。)

把这些放在一起,你会得到:

listToTuples :: [String] -> [(String, Int, String, Int, String, Int)]

也就是说,listToTuples,给定一个字符串列表,将返回一个元组列表。现在听起来差不多!

现在,进入下一行:

    listToTuples = map listToTuples

这里还有两个错误:

  • 不要缩进它!如果你缩进这一行,Haskell 会将它解释为上一行的延续,这是不应该的。 (有关 Haskell 缩进的更多信息,请参阅https://en.wikibooks.org/wiki/Haskell/Indentation)。
  • 您正在根据listToTuples 定义listToTuples。这不可能有任何作用!当编译器试图运行你的代码时,它会进入一个无限循环,为了运行listToTuples,它会尝试在列表中的每个元素上运行listToTuples,这意味着它必须运行@ 987654338@ 在那些的每个元素上,意思是……

幸运的是,你做对了一件事:你正在使用map!正如您所注意到的,map 正是解决此问题的正确工具。因此,解决方案如下所示:

listToTuples :: [String] -> [(String, Int, String, Int, String, Int)]
listToTuples = map _

但是将_ 替换为将String 转换为(String, Int, String, Int, String, Int) 的函数。我将留给您弄清楚该功能可能是什么。 (提示:使用递归查找空格之间的所有位,然后使用read 将字符串转换为数字。)

【讨论】:

    猜你喜欢
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多