理解函数elem和isInfixOf

man*_*ang 1 haskell

前一段时间,我问了一个关于函数的问题elem 在这里,但我不认为答案是完全令人满意.我的问题是关于表达式:

any (`elem` [1, 2]) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我们知道elem是一个反引号,所以elem是一个中缀,我的解释是:

1 `elem` [1, 2] -- True
2 `elem` [1, 2] -- True
3 `elem` [1, 2] -- False
Run Code Online (Sandbox Code Playgroud)

最后它将返回,True因为它any不是all.这看起来不错,直到我看到类似的表达式isInfixOf:

any (isInfixOf [1, 2, 3]) [[1, 2, 3, 4], [1, 2]]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,似乎合理的解释似乎是:

isInfixOf [1, 2, 3] [1, 2, 3, 4] -- True
isInfixOf [1, 2, 3] [1, 2]       -- False
Run Code Online (Sandbox Code Playgroud)

我想知道为什么他们从那时起就以这种不同的方式被使用了

any (elem [1, 2]) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

会出错,所以会

any (`isInfixOf` [[1, 2, 3, 4], [1, 2]]) [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

Has*_*ant 6

你的问题在于(** a)语法糖.问题是这(elem b)只是elem的部分应用,即:

(elem b) == (\xs -> elem b xs)
Run Code Online (Sandbox Code Playgroud)

但是当我们使用反向标记来生成elem中缀时,我们会为中缀运算符获得一个特殊的语法,其工作原理如下:

(+ a) == (\ b -> b + a)
(a +) == (\ b -> a + b)
Run Code Online (Sandbox Code Playgroud)

因此,

(`elem` xs) == (\a -> a `elem` xs) == (\ a -> elem a xs)
Run Code Online (Sandbox Code Playgroud)

(elem xs) == (\a -> elem xs a)
Run Code Online (Sandbox Code Playgroud)

所以在后一种情况下,你的参数的顺序是错误的,这就是你的代码中发生的事情.

请注意,(** a)语法糖适用于所有中缀运算符,除非-它也是前缀运算符.这里这里讨论了规则的这个例外.