接受输入字符串并返回仅以“ ba”开头的单词的字符串列表?

时间:2018-10-19 21:19:22

标签: haskell

我正在尝试编写一个将输入字符串说为的代码:

I love bacon, but I love bananas more.

并返回["bacon","bananas"]作为输出。

但是我的代码遇到了一些麻烦,因为我似乎无法正确实现此问题,目前,我的想法是输入一个字符串,然后使用word()将字符串拆分为字符串列表,然后调用getWrods提取所有以“ ba”为前缀的单词,然后为主要功能allWords返回一个以“ ba”开头的单词组成的列表。

我的代码如下:

getWords:: String -> [String] -> [String]
getWords n [] = []
getWords n (x:xs)
 | n isPrefixOf x = [x] ++ getWords n xs
 |otherwise = getWords n xs


allWordss:: String -> [String]
allWordss n = getWords("ba" words(n))

2 个答案:

答案 0 :(得分:2)

我认为通过在此处使用filter :: (a -> Bool) -> [a] -> [a],可以使问题变得更容易。

您可以作为过滤条件使用-就像您的代码isPrefixOf :: Eq a => [a] -> [a] -> Bool中一样,但是您在此处以“中缀”表示法编写,但没有编写反引号。因此,您可以使用以下命令调用该函数:

isPrefixOf n x

或:

n `isPrefixOf` x

代码的最后一个问题是您编写:

getWords("ba" words(n))

在这里您似乎用方括号来调用函数,这在Java,C ++等语言中很常见。但是在Haskell中,函数f的调用带有参数x,例如{{ 1}},因此您可以通过以下方式拨打电话:

f x

如果在此处使用getWords "ba" (words n) ,我们将获得:

filter

或更短:

allBaWords :: String -> [String]
allBaWords n = filter (\x -> isPrefixOf "ba" x) (words n)

答案 1 :(得分:1)

我们可以将问题分为三个逻辑部分:

  1. 将字符串分成单词列表。
  2. 识别单词是否以“ ba”开头。
  3. 给出一个列表,获取满足特定条件的所有元素的列表(通常称为 predicate )。

让我们从导入几个标准模块开始:

import Data.List (isPrefixOf)
import Data.String (words)

让我们从(2)开始:

startsWithBa :: String -> Bool
startsWithBa s = -- something using isPrefixOf

正如其他人所指出的那样,如果要使用infix(大多数人倾向于这样做,它读起来很不错),则必须将isPrefixOf括在反引号中。

现在将字符串分成单词,我们使用

words :: String -> [String]

要仅提取以“ ba”开头的字符串,我们可以使用函数

filter :: (a -> Bool) -> [a] -> [a]

我会让你尝试将这些碎片放在一起。