Как преобразовать список строк в список кортежей?(Haskell) - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть список строк: студенты, их оценка по определенному курсу, название курса.Мне нужно преобразовать каждую строку внутри списка в кортеж, так как он содержит как строки, так и целые числа.

[«PHL 220 A 3 Ада Лавлейс А», «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, поэтому синтаксис очень запутанный.

1 Ответ

1 голос
/ 27 сентября 2019

В вашей предоставленной попытке довольно много ошибок.К счастью, эти ошибки в основном синтаксические, и вы подходите к проблеме правильно.

Давайте построчно:

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

Это почти правильно, но:

  • Вы указали тип ввода [[String]], то есть список строк.Тем не менее, ваши входные данные на самом деле представляют собой список строк - то есть [String].
  • (String | Integer) не является правильным синтаксисом Haskell.Правильный синтаксис: (String, Integer).Кроме того, ваш выходной тип на самом деле является кортежем строки, целого числа, строки, целого числа, строки и целого числа, что переводится как (String, Int, String, Int, String, Int).(Вы можете использовать Integer, если хотите, но это не обязательно; если вам интересно, найдите разницу между Int и Integer в Haskell.)

Сложив их вместе, вы получите:

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, чтобы преобразовать строки в числа.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...