Haskell 不带反勾号的功能元素不工作

Haskell 不带反勾号的功能元素不工作,haskell,functional-programming,Haskell,Functional Programming,我必须在Haskell中创建一个布尔函数,它接收一个单词(字符串)和一个字符列表。函数必须验证列表中的所有字符是否包含在字符串中。我做了一些研究,发现函数all和elem可能会有所帮助 例如: word = "hello" list = ['h','o','e'] 我的代码如下所示: allCharBelong word list = all (`elem` word) list 我做了一些测试,它工作得很好(如果你想再次检查,那就好了) 我的问题是:为什么当我在elem中去掉反勾号时,函数

我必须在Haskell中创建一个布尔函数,它接收一个单词(字符串)和一个字符列表。函数必须验证列表中的所有字符是否包含在字符串中。我做了一些研究,发现函数
all
elem
可能会有所帮助

例如:

word = "hello"
list = ['h','o','e']
我的代码如下所示:

allCharBelong word list = all (`elem` word) list
我做了一些测试,它工作得很好(如果你想再次检查,那就好了)

我的问题是:为什么当我在elem中去掉反勾号时,函数不起作用?

工作:
allcharalley单词列表=所有(`elem`word)列表


不工作:
allcharalley word list=all(elem word)list
(`elem`word)
是部分应用第二个参数的运算符部分,它相当于
\x->elem x word
,而
elem word
(word`elem`)=
\x->elem word x
。它有助于用类型注释表达式,以了解有时会发生什么。

添加反勾号会使函数中缀
elem
在中缀形式中使用时是一个二进制运算符。将参数放在中缀运算符之前或之后可确定我们应用于哪一个参数:

(`elem` word) === \char -> elem char word -- apply to second arg
(char `elem`) === \word -> elem char word -- apply to first arg
elem
没有反勾号只是一个常规的curried函数:

elem char === \word -> elem char word -- can only apply partially to first arg

它不起作用,因为在第一种情况下,你有所谓的“节”,即中缀运算符的部分应用,在这种情况下,你修复了第二个参数,在第二种情况下,你修复了第一个参数

ghci> :t elem "string"
elem "string" :: [[Char]] -> Bool
ghci> :t (`elem` "string")
(`elem` "string") :: Char -> Bool
(`op`val)
flip op val
的另一种书写方式(我觉得这很好,因为背景符号对于阅读来说非常不突出):它允许您在第二个参数(而不是第一个参数)中部分应用函数

当然,此类运算符部分更常用于已经采用中缀形式的函数,例如

前奏曲>地图(!!.4)[“…你好”,“你好”,“你好”,“你好”,“你好”,“你好”,“你好”]
“你好”
序曲>地图(/2)[10,20,30,40]
[5.0,10.0,15.0,20.0]


谢谢你的澄清。也许是另一种方式来做我需要的功能?(使用组合、高阶和/或部分应用)@warty yes:
(`elem`word)x=x`elem`word=(x`elem`)word=elem x word=flip elem word x
,所以
(`elem`word)=flip elem word