在Haskell中定义Takeword,Dropword和Words功能

时间:2019-04-06 14:07:30

标签: haskell

我正在尝试在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)

2 个答案:

答案 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的最长前缀(可能为空)

在这种情况下,谓词正在测试元素不是空格。因此,这将返回不包含空格的最长前缀。