Хорошо, я придумал уродливый хак, который делает эту работу. (К сожалению, вносит ошибку)
import Data.Char (isSpace, isDigit)
strip :: String -> String
strip = filter (not . isSpace)
addSpacing :: String -> String
addSpacing [a] = [a]
addSpacing (x:y:cs)
| isDigit x && isDigit y = x : addSpacing rest
| otherwise = x : ' ' : addSpacing rest
where rest = y : cs
splitTok :: String -> [String]
splitTok = words . addSpacing . strip
Не удалось создать правильную строку токенов в этом примере:
ghci> splitTok "125 + 12 62 - 12 *( 51/ 3) "
["125","+","1262","-","12","*","(","51","/","3",")"]
Для большинства выражений работает нормально, хотя:
ghci> splitTok "4123-36522+12"
["4123","-","36522","+","12"]
ghci> splitTok "124 *(12 -(4+5*(331/7)))"
["124","*","(","12","-","(","4","+","5","*","(","331","/","7",")",")",")"]