ошибка разделения функции «нет экземпляра для»

#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. Я не могу прочитать ваш код в том виде, в каком вы его представили. Так что нет, я понятия не имею, что происходит. Я рекомендую принять этот ответ (как только вы сможете) и задать новый вопрос относительно вашей проблемы.