如何将字符串列表转换为元组列表? (哈斯克尔)

时间:2019-09-26 23:05:32

标签: list haskell tuples

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

[[“ PHL 220 A 3 Ada Lovelace A”,“ PHL 220 A 3 Grace Hopper C”,“ THE 105 A 3 Grace Hopper B +”]

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

我试过了,但是没用。

<!DOCTYPE html>
    <html lang="en-us">
      <head>
        <title>Giphy API</title>
        <meta charset="utf-8" />
        <meta name="description" content="Giphy API" />
        <meta name="keywords" content="javascript, api, web developement" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <link
          rel="stylesheet"
          href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
          integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
          crossorigin="anonymous"
        />
      </head>
      <body>
        <div class="container">
          <form id="button-form row">
            <label for="button-input"></label>
            <input type="text" id="button-input" />
            <input id="add-button" type="submit" value="Search Giphy" />
          </form>
        </div>
        <div class="container">
          <div class="col">
            <button class="gif-button">dogs</button>
            <button class="gif-button">cats</button>
            <button class="gif-button">birds</button>
          </div>
        </div>

        <div class="container gifs">
          <div class="images row"></div>
        </div>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
      </body>
  <html>

我对Haskell非常陌生,因此语法非常混乱。

1 个答案:

答案 0 :(得分: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,这意味着它必须在那些的每个元素上运行listToTuples,这意味着...

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

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

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