我正在尝试在Haskell中定义一个takeWord函数,该函数接受一个字符串并返回其第一个单词。从开始到结束,直到第一个空格字符为止,每次应占用每个字符。它应该返回第一个空格字符之前的字符。 dropword功能与takeword类似,但删除第一个单词并休息。 wordsof函数类似于haskell中的word函数。
takeword :: String -> String
takeword "" = ""
takeword (x:xs) = x : takeword xs
结果样本
*Main> takeword "abcdef"
"abcdef"
dropword :: String -> String
dropword "" = ""
dropword (' ': xs) = ""
dropword (x:xs) = drop length(takeword xs) takeword xs
wordsof :: String -> [[Char]]
wordsof "" = []
wordsof (x:xs) = takeword xs
wordsof x = splitOn (takeword x)
答案 0 :(得分:6)
好吧,让我们从定义开始:
takeword :: String -> String
takeword "" = ""
takeword (x:xs) = x : takeword xs
这对区别非空格字符和空格没有任何作用。第一步是在空格上进行模式匹配。因此,让我们将第二行分为两种情况:
takeword :: String -> String
takeword "" = ""
takeword (' ':xs) = error "TODO" -- Spaces
takeword (x:xs) = x : takeword xs -- Non-spaces
现在,如果我们遇到一个空格,那么很显然这就是我们需要去的地方,因此在这一点上,我们可以返回一个空字符串。进行一些格式化后,我们得到以下信息:
takeword :: String -> String
takeword "" = ""
takeword (' ':xs) = ""
takeword (x :xs) = x : takeword xs
就是这样。这里的所有都是它的。它在起作用:
λ> takeword "Hello, World!"
"Hello,"
λ> takeword "This is a test."
"This"
λ> takeword "is a test."
"is"
锻炼:如果我想在第一个单词上分割一个字符串怎么办,所以splitOnWord "Hello, world of worlds!"
返回("Hello,", "World of worlds!")
?鉴于您已经拥有takeword
函数,可以很容易地编写该代码。
答案 1 :(得分:2)
这是一个更简单的解决方案:
takeword = takeWhile (' ' /=)
从文档中:
takeWhile
应用于谓词p和列表xs,返回满足xs
的元素p
的最长前缀(可能为空)
在这种情况下,谓词正在测试元素不是空格。因此,这将返回不包含空格的最长前缀。