Haskell Assignment - 将String拆分为单词所需的方向

rth*_*sen 3 haskell

我们几周前开始写一篇关于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)

什么是第一个明显的错误?谢谢.

Dan*_*her 8

第一个明显的错误是

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.