gpt4 book ai didi

haskell - 使用 isPrefixOf 过滤元组列表

转载 作者:行者123 更新时间:2023-12-02 11:32:32 26 4
gpt4 key购买 nike

我需要一个函数,它可以执行以下操作:

prefixes :: String -> [String] -> [(Int,String)]
prefixes "apples" ["ap","appl","le"] == [(0, "ap"), (1, "appl")] :: [(Int, String)]

到目前为止,我已经成功做到了:

prefixes xs (y:ys) = filter ((isPrefixOf xs).snd) a where
a=(zip [0..] (y:ys))

但是结果是一个空列表,我无法找到使其工作的方法。(是的,这是一份作业,我没能按时完成,但我仍然很好奇如何正确完成)

最佳答案

isPrefixOf 的命名有时可能会有点令人困惑,因为它旨在与反引号一起使用中缀,例如

> "ap" `isPrefixOf` "apples"
True

但是,这意味着当我们不带反引号编写时,参数顺序是

isPrefixOf "ap" "apples"

因此,部分应用程序 isPrefixOf xs 是检查 xs 是否为其参数的前缀的函数,而不是相反。这就是为什么你得到一个空列表,因为你正在检查 "apples" 是否是任何较短字符串的前缀,这显然会为所有这些字符串返回 False .

可以通过三种简单的方法来解决此问题。一种是使用 flip,它交换双参数函数的参数顺序:

flip isPrefixOf xs

第二种是在运算符部分使用反引号:

(`isPrefixOf` xs)

第三种方法是明确并使用 lambda:

\y -> y `isPrefixOf` xs 

关于haskell - 使用 isPrefixOf 过滤元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8308542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com