前一段时间,我问了一个关于函数的问题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)
你的问题在于(** 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)语法糖适用于所有中缀运算符,除非-它也是前缀运算符.这里和这里讨论了规则的这个例外.
| 归档时间: |
|
| 查看次数: |
5854 次 |
| 最近记录: |