我正在尝试编写一个将输入字符串说为的代码:
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))
答案 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)
我们可以将问题分为三个逻辑部分:
让我们从导入几个标准模块开始:
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]
我会让你尝试将这些碎片放在一起。