[英]Understanding the functions elem and isInfixOf
不久前,我在这里询问了有关函数elem
问题 ,但我认为答案并不完全令人满意。 我的问题是关于表达式:
any (`elem` [1, 2]) [1, 2, 3]
我们知道elem
属于反引号,因此elem
是一个中缀,我的解释是:
1 `elem` [1, 2] -- True
2 `elem` [1, 2] -- True
3 `elem` [1, 2] -- False
最后,它将返回True
因为它是any
而不是all
。 直到我看到与isInfixOf
类似的表达式为止,这看起来不错:
any (isInfixOf [1, 2, 3]) [[1, 2, 3, 4], [1, 2]]
在这种情况下,一个合理的解释似乎是:
isInfixOf [1, 2, 3] [1, 2, 3, 4] -- True
isInfixOf [1, 2, 3] [1, 2] -- False
我不知道为什么自从
any (elem [1, 2]) [1, 2, 3]
会给出错误,所以也会
any (`isInfixOf` [[1, 2, 3, 4], [1, 2]]) [1, 2, 3]
您的问题在于(** a)
语法糖。 问题是(elem b)
只是elem的部分应用,即:
(elem b) == (\xs -> elem b xs)
但是,当我们使用反斜杠使elem infix时,我们为infix运算符获得了一种特殊的语法,其工作方式如下:
(+ a) == (\ b -> b + a)
(a +) == (\ b -> a + b)
因此,
(`elem` xs) == (\a -> a `elem` xs) == (\ a -> elem a xs)
而
(elem xs) == (\a -> elem xs a)
因此,在后一种情况下,您的参数顺序错误,这就是代码中发生的情况。
在函数名称周围使用反引号会将其转换为中缀运算符。 所以
x `fun` y
是相同的
fun x y
Haskell还具有运算符部分,fe (+ 1)
表示\\x -> x + 1
。
所以
(`elem` xs)
是相同的
\x -> x `elem` xs
要么
\x -> elem x xs
要么
flip elem xs
这称为部分应用程序 。
isInfixOf [1, 2, 3]
返回一个需要一个参数的函数。
any (elem [1, 2]) [1, 2, 3]
是错误的,因为您正在寻找元素[1, 2]
,并且列表仅包含数字,因此haskell无法匹配类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.