логическая ошибка разделения строки

#haskell #split #tokenize

#haskell #разделение #маркировать

Вопрос:

Привет, эта функция должна принимать строку и возвращать список строк, разделенных на символ c . Я должен определить некоторые вспомогательные функции, но в настоящее время пользователь должен инициализировать аргументы, которые должны быть скрыты от них.

xs = список вывода, i = начальный индекс для substr, j = конечный индекс для substr

пример: разделение «123,456,789» ‘,’ [] 0 0

должно привести [«789», «456», «123»]

 split s c xs i j =
        if j == length s
        then (subStr s i j) : xs
        else if head (drop j s) == c
        then split s c (subStr s i j : xs) (j   1) (j   1)
        else split s c xs i (j   1)

subStr s i j = take j(drop i s)
  

Когда я применяю функцию со следующими аргументами: split «123,456,789» ‘,’ [] 0 0

Я получаю результат: [«789», «456,789», «123»]

Комментарии:

1. ну, было бы хорошо, если бы вы использовали хорошие имена переменных, я смотрю на это и просто все больше и больше запутываюсь.

Ответ №1:

Я уже упоминал об этом в вашем другом сообщении, но проблема с этим заключается в вашей subStr функции. Если вы измените его на subStr s i j = take (j-i) (drop i s) , он должен работать. И если это все, что вы хотите, отлично. Но это можно было бы написать более четко и легко, используя takeWhile или используя split from data.Text .

Кроме того, введите подписи, пожалуйста. (Хотя я ценю, что на этот раз вы определили входные данные.) Они не только облегчают нам помощь, вы часто можете решить свои собственные проблемы в процессе их решения.

Комментарии:

1. span или break даже более полезны, чем takeWhile здесь.