В вашей предоставленной попытке довольно много ошибок.К счастью, эти ошибки в основном синтаксические, и вы подходите к проблеме правильно.
Давайте построчно:
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
, чтобы преобразовать строки в числа.)