Как реализовать функцию разделения Haskell? - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу реализовать Haskell функцию wordToken, которая разбивает строку слов на список строк, включающий полные остановки и запятые

Например, "the man saw." должно привести к ["the", "man","saw","."]

Итак, я проверил, является ли Char запятой или полной остановкой, а затем просто добавьте его как есть. Затем, если это Char, а затем Char, добавьте их обоих. Иначе, если это Char, а затем пробел, добавьте его и продолжите до конца списка. Но я не уверен, как мне сказать, чтобы они разделяли сами слова, или когда я добавляю символ к символу, то это новая строка

 wordToken []= " "

 wordToken (x:y:z) | x==',' || x=='.' = " "(++)x:wordToken( y:z)
              | x/='\n' && y/='\n'= " "(++)x(++)y(++)wordToken z
              | x/='\n' && y=='\n'= " "(++)x:wordToken z
              |     otherwise = wordToken z 

Я также попытался использовать функцию слова и просто добавить часть знаков препинания, но это дало мне несоответствие типов wordToken (x: xs) | х == '' || x == ',' = 'x': wordToken xs | в противном случае = слова (x: xs)

1 Ответ

2 голосов
/ 18 апреля 2020

Чтобы улучшить вашу идею, я предлагаю использовать вспомогательную функцию с аккумулятором, который сохраняет текущие символы до следующего разделителя. Как только вы достигнете конца строки или другого разделителя, вы добавите накопленное новое слово в список и сбросите аккумулятор на "".

wordToken :: String -> [String]
wordToken "" = [] -- empty list
wordToken str = helper str "" -- start helper with empty current word
    where helper :: String -> String -> [String]
          -- when the entire string is consumed
          helper "" ""      = [] -- if no current word, append nothing
          helper "" current = [current] -- if current word, append this to the list
          -- otherwise
          helper (x:xs) current
              | x == ',' || x == '.' = current : [x] : helper xs "" -- add comma or fullstop as extra word
              | x == ' '             = current : helper xs "" -- but skip on whitespaces
              | otherwise            = helper xs (current ++ [x]) -- if no seperator, just continue building up the current word

В результате вы получите ожидаемый результат:

wordToken "the man saw."
> ["the", "man", "saw", "."]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...