Вы можете использовать функцию, подобную этой:
stripComments :: String -> String
stripComments [] = []
stripComments ('/':'/':xs) = inComment xs
stripComments ('/':'*':xs) = inMultiComment xs
stripComments (x:xs) = x : stripComments xs
Это просто «зацикливает» строку рекурсивным способом (однако, это хвостовая рекурсивность, таким образом, это как цикл) и копирует каждый символкоторого нет в комментарии.
Следующие функции используются для определения конца комментария.Они игнорируют любые символы, кроме конечных разделителей, поэтому подчеркивание в шаблоне совпадает.
inComment :: String -> String
inComment ('\n':xs) = stripComments xs
inComment (_:xs) = stripComments xs
inComment [] = []
inMultiComment :: String -> String
inMultiComment ('*':'/':xs) = stripComments xs
inMultiComment (_:xs) = inMultiComment xs
inMultiComment [] = []
Однако, если вы используете более сложный синтаксический анализ, я рекомендую сделать снимок в библиотеке монадического анализа Parsec.1010 * РЕДАКТИРОВАТЬ: Как указал user268396, вы должны знать, что что-то похожее на комментарий может скрываться в строке.Возможно, вы захотите расширить вышеупомянутые функции с помощью функции «inString», которая не игнорирует встречаемые символы, но не переключается на inComment или inMultiComment, если встречает начальные разделители для них.