#haskell #split #tokenize
#haskell #разделение #маркировать
Вопрос:
эта функция должна обозначать строку:
split s c xs i j =
if head s == c
then split s c (subStr s i j : xs) j (j 1)
else if j == length s
then (subStr s i j) : xs
else split s c xs i j 1
subStr s i j = take j(drop i s)
Однако я получаю сообщение об ошибке следующего содержания:
Нет экземпляра для (Num [[Char]]), возникающего из-за использования ‘split’
Возможное исправление: добавьте объявление экземпляра в (Num [[Char]])
Спасибо.
Теперь функция Ok:
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. Вы должны указать свою подпись типа для функции. Нам немного легче определить, что вы пытаетесь сделать. но мое первоначальное предположение заключается в том, что вам просто нужно заключить скобки
j 1
в предпоследнюю строку.2. Я согласен с cdk в том, что эту функцию можно было бы переписать более четко. Но если вы просто хотите, чтобы это сработало, сделайте
substr s i j = take (j-i) (drop i s)
Ответ №1:
Проблема в строке else split s c xs i j 1
. Похоже, вы пытаетесь добавить 1 к результату split
. Вы, вероятно, забыли скобки вокруг (j 1)
Я предполагаю split
, что возвращает a [String]
, да?
Редактировать: за вашей функцией трудно следить. Странный порядок, вероятно, является результатом того, что вы добавляете подстроки в 3-ю строку (subStr s i j) : xs
.
Попробуйте переписать свою функцию, используя takeWhile, dropWhile :: (a -> Bool) -> [a] -> [a]
или, что еще лучше, правильную библиотеку обработки строк, подобную ByteString
той, которая предоставляет
Data.ByteString.Char8.split :: (Char -> Bool) -> ByteString -> [ByteString]
Комментарии:
1. Спасибо, теперь возникла проблема с логикой: итак, функция выглядит следующим образом: разделите s c xs i j = если j == длина s, то (subStr s i j): xs еще, если head (drop j s) == c, затем разделите s c (subStr s i j: xs) (j 1) (j 1) иначе разделить s c xs i (j 1) subStr s i j = взять j (отбросить i s), когда я применяю: разделить «123,456,789» ‘c’ [] 0 0 Я получаю вывод [«789», «456, 789», «123»] есть какие-нибудь идеи, что там происходит в середине?
2. Я не могу прочитать ваш код в том виде, в каком вы его представили. Так что нет, я понятия не имею, что происходит. Я рекомендую принять этот ответ (как только вы сможете) и задать новый вопрос относительно вашей проблемы.