我们几周前开始写一篇关于Haskell的论文,刚收到我们的第一份作业.我知道SO不喜欢家庭作业问题,所以我不打算问怎么做.相反,如果有人能用这个推动我朝着正确的方向发展,我将非常感激.看来它可能不是一个特定的问题,它会更适合在讨论/社区维基中吗?
问题: Tokenize一个字符串,即:"Hello,World!" - > ["Hello","World"]
来自Java背景,我不得不忘记关于通常的方法.问题是我对Haskell仍然很无能为力.这就是我想出来的:
module Main where
main :: IO()
main = do putStrLn "Type in a string:\n"
x <- getLine
putStrLn "The string entered was:"
putStrLn x
putStrLn "\n"
print (tokenize x)
tokenize :: String -> [String]
tokenize [] = []
tokenize l = token l ++ tokenize l
token :: String -> String
token [] = []
token l = takeWhile (isAlphaNum) l
Run Code Online (Sandbox Code Playgroud)
什么是第一个明显的错误?谢谢.
第一个明显的错误是
tokenize l = token l ++ tokenize l
Run Code Online (Sandbox Code Playgroud)
(++) :: [a] -> [a] -> [a]附加两个相同类型的列表.从token :: String -> String(和type String = [Char])开始,tokenize从该行推断出的类型是tokenize :: String -> String.你应该(:) :: a -> [a] -> [a]在这里使用.
该行中的下一个错误是在递归调用中,您l再次传递相同的输入,因此您具有无限递归,始终执行相同而无需更改.您必须从递归调用的参数的输入中删除第一个标记(以及更多).
另一个问题是您token假设输入以字母数字字符开头.
您还需要一个函数来确保传递给您的条件token.