Haskell 如何在此实例中应用use map?

Haskell 如何在此实例中应用use map?,haskell,Haskell,我有一个月的清单和一个字符串。我想看看这几个月里有没有一个月是连续的。我还有一个函数,可以在字符串中搜索单词。我是否必须重写该函数,或者是否可以使用某种形式的映射 fullMons = ["january", "febuary", "march", "april", "may", "june", "july", "september", "october", "november", "december"] searchStrList :: String -> [String] ->

我有一个月的清单和一个字符串。我想看看这几个月里有没有一个月是连续的。我还有一个函数,可以在字符串中搜索单词。我是否必须重写该函数,或者是否可以使用某种形式的映射

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,因此对我的代码的任何其他评论都将不胜感激。谢谢

您可以使用
any
函数检查谓词对于列表中的任何成员是否为true

这里我使用了
Data.List
中的
isInfixOf
函数来生成谓词:

check :: String -> Bool
check str = any (`isInfixOf` str) fullMons

请注意,
fullMons
不是一个函数,而是一个列表,
searchStrList
不键入
words
接受单个字符串,但将其应用于字符串列表

words str :: [String]
我猜您要做的是查找字符串中的单词是否包含
fullMons
中的任何月份名称。让我们试着一步一步地推导出一个解决方案。我们要做的第一件事是将
单词
应用到输入字符串;这会给我们一个字符串列表

words str :: [String]
然后我们想知道
单词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
,然后对
words
的结果应用
any(\word->elem word fullMons)
。您可以将其进一步简化为:

check :: String -> Bool
check = any (`elem` fullMons) . words
(即,“我们输入的
单词
的任何元素是否出现在
fullMons
?”)

但这是没有必要的

我认为您试图得到的最初解决方案是依次检查整个字符串上的每个月名称。为此,我们只需稍微翻转一下控制结构:

check :: String -> Bool
check str = any (\word -> word `elem` ws) fullMons
  where ws = words str
(即,“
fullMons
的任何元素是否出现在
words str
?”)

使用类型,然后从中将这些类型转换为字符串表示形式,如中所示:

show April

Month
也应派生
Enum
Ord
Bounded
。然后,您可以从1月份开始通过
枚举获得整个月份的数据。