gpt4 book ai didi

haskell - 在这种情况下如何应用 use map?

转载 作者:行者123 更新时间:2023-12-01 07:43:13 24 4
gpt4 key购买 nike

我有一个月份列表和一个字符串。我想检查字符串中是否有任何月份。我还有一个函数,可以在字符串中搜索单词。我必须重写该函数还是可以使用某种形式的 map ?

fullMons = ["january", "febuary", "march", "april", "may", "june", "july", "september", "october", "november", "december"]

searchStrList :: String -> [String] -> Bool
searchStrList str strList = elem (map toLower str) $ convertToLower $ words strList

我如何利用这些功能来做这样的事情:
check :: String -> Bool 
check str = searchStrList "january" || searchStrList "febuary" || ...

仍然只是在学习 Haskell,所以对我的代码的任何其他评论表示赞赏。谢谢

最佳答案

请注意 fullMons不是函数而是列表,并且 searchStrList不打字; words接受单个字符串,但您将其应用于字符串列表。

我猜您想要做的是查找字符串的单词是否包含 fullMons 中的任何月份名称。 .让我们尝试逐步推导出解决方案。我们要做的第一件事就是申请 words到我们的输入字符串;这为我们提供了一个字符串列表。

words str :: [String]

然后我们想找出 words s中是否有任何一个元素是月份名称。有一个功能 any :
any :: (a -> Bool) -> [a] -> Bool

所以,我们的解决方案应该看起来像
check str = any ??? (words str)

我们所要做的就是找出 ??? . elem函数让我们检查列表中的元素是否:
elem :: (Eq a) => a -> [a] -> Bool

在这种情况下,列表应该是月份列表,我们要搜索的元素应该是字符串中的单词。所以,填空:
check :: String -> Bool
check str = any (\word -> word `elem` fullMons) (words str)

(注意: foo `op` bar 只是 op foo bar ;许多运算符都被设计为以这种方式编写和阅读。)

我们可以通过去掉参数来使这个更简单、更惯用:
check :: String -> Bool
check = any (\word -> word `elem` fullMons) . words

这意味着我们申请 words到输入,然后应用 any (\word -> elem word fullMons)words 的结果.您可以将其进一步简化为:
check :: String -> Bool
check = any (`elem` fullMons) . words

(即,“我们输入的 words 的任何元素是否出现在 fullMons 中?”)

但这不是必需的。

我认为您试图获得的原始解决方案是依次检查整个字符串上的每个月名称。为此,我们只需要稍微翻转控制结构:
check :: String -> Bool
check str = any (\word -> word `elem` ws) fullMons
where ws = words str

(即,“ fullMons 的任何元素是否出现在 words str 中?”)

关于haskell - 在这种情况下如何应用 use map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8734277/

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