Haskell 如何使用给定单词的第n个字母等于另一个单词的第m个字母这样的条件进行模式匹配?

Haskell 如何使用给定单词的第n个字母等于另一个单词的第m个字母这样的条件进行模式匹配?,haskell,pattern-matching,Haskell,Pattern Matching,给出一个单词列表,比如[hello,pale,笑话,okay],我如何将下面的语句转换成Haskell代码 给我列表中的单词集,使第一个单词的第二个字母等于第二个单词的第一个字母 在本例中,答案是[开玩笑,好吧],因为字母“o”满足条件。通常,我如何指定我需要一组单词,其中一个单词的第n个字母等于另一个单词的第m个字母 此外,我如何将这个概念扩展到多个单词,例如,给我一组单词,其中第一个单词的第四个字母等于第二个单词的第三个字母,第一个单词的最后一个字母等于第三个单词的第一个字母。给定列表的结果

给出一个单词列表,比如[hello,pale,笑话,okay],我如何将下面的语句转换成Haskell代码

给我列表中的单词集,使第一个单词的第二个字母等于第二个单词的第一个字母

在本例中,答案是[开玩笑,好吧],因为字母“o”满足条件。通常,我如何指定我需要一组单词,其中一个单词的第n个字母等于另一个单词的第m个字母


此外,我如何将这个概念扩展到多个单词,例如,给我一组单词,其中第一个单词的第四个字母等于第二个单词的第三个字母,第一个单词的最后一个字母等于第三个单词的第一个字母。给定列表的结果应该是[hello,pale,okay]。

第一个用例在Haskell中很容易解决,您首先需要将连续的单词配对:

pairs :: [String] -> [(String, String)]
pairs wrds = zip wrds $ drop 1 wrds
然后编写逻辑以匹配第一个单词的第二个字母和第二个单词的第一个字母,模式匹配非常简单:

secondLetterMatchesFirstLetter :: String -> String -> Bool
secondLetterMatchesFirstLetter (_:a:_) (b:_) = a == b
secondLetterMatchesFirstLetter _ _ = False
最后,将这些联系在一起:

matchingWords :: [String] -> [(String, String)]
matchingWords = filter (uncurry secondLetterMatchesFirstLetter) . pairs
对任何第m个和第n个字母执行此操作都需要一些额外的参数,并使用更通用的函数交换secondLetterMatchesFirstLetter,让我们先写下:

mthMatchesNth :: Int -> Int -> String -> String -> Bool
mthMatchesNth m n first second = (first `safeIdx` m) == (second `safeIdx` n)
    where
        -- Note: this isn't efficient
        safeIdx [] n = Nothing
        safeIdx (x:_) 0 = Just x
        safeIdx (_:rest) n = safeIdx rest (n - 1)

matchingWords :: Int -> Int -> [String] -> [(String, String)]
matchingWords m n = filter (uncurry $ mthMatchesNth m n) . pairs

将此扩展到任意单词分组的工作可能会有点复杂,我将让您自己处理。这段代码应该让您开始了解如何进行匹配本身,特别是因为不管怎样,您都可以重用mthMatchesNth函数。我会考虑制作一个数据类型来表示这个问题,因为仅仅传递一些int数会使它很难跟上细节。

是不是‘O’满足了你例子中所需要的条件?@ BWeGS谢谢。更正。你的问题在最后一段变得相当复杂。在这一点上你有什么?您是否解决了仅匹配成对单词的原始问题?您认为您可以通过哪些方式扩展该解决方案,以处理与第n个字母匹配的第m个字母?对于完全通用的情况,您需要向函数传递哪些信息?@bheklillr不,我还没有解决最初的问题。我是一个完全的初学者,他在自学Haskell。然而,根据我所知的一点,我觉得这个问题在Haskell中将有一个优雅的解决方案。具体地说,我想知道,如果可以用来制作纵横字谜的单词来自固定的词典,纵横字谜是否可以解决。因此,这意味着函数必须接受字典,以及每个单词与另一个或多个单词的链接方式。我希望这能让事情更清楚。非常感谢。我想我可以扩展这个解决方案。顺便问一下,我的问题有问题吗?我不认为这是完全重复的,因为我在谷歌上搜索后找不到解决方案。或者这个问题违反了任何其他准则?@GreenNoob可能更多是因为你的问题中没有显示任何作业,而且看起来很像家庭作业问题。请记住,stackoverflow的理想是成为有用问题和答案的存储库,您的问题可能主要帮助懒惰的学生快速解决他们的家庭作业。当然,事实并非如此,人们在遇到问题时会来到这里,他们需要一个具体的答案。@GreenNoob在未来,最好是询问如何扩展已经解决了更复杂问题的代码,而不是试图从一开始就找到解决方案。否决票意味着你没有问过对别人有用的问题,而不是你有重复或琐碎的问题。