函数elem没有反引号不工作

时间:2014-04-07 07:34:55

标签: haskell functional-programming

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

示例:

word = "hello"
list = ['h','o','e']

我的代码看起来像这样:

allCharBelong word list = all (`elem` word) list

我做了一些测试,它完美地工作(如果你想仔细检查一下会很好)。

我的问题是:为什么当我在elem中取出反引号时,该功能不起作用?

工作:allCharBelong word list = all (`elem` word) list

不工作:allCharBelong word list = all (elem word) list

4 个答案:

答案 0 :(得分:6)

(`elem` word)是部分应用第二个参数的运算符部分,相当于\x -> elem x wordelem word = (word `elem`) = \x -> elem word x。它有助于用类型注释表达式,以便弄清楚有时会发生什么。

答案 1 :(得分:1)

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

ghci> :t elem "string"
elem "string" :: [[Char]] -> Bool
ghci> :t (`elem` "string")
(`elem` "string") :: Char -> Bool

答案 2 :(得分:0)

添加反引号会使函数中缀。以中缀形式使用时,elem是二元运算符。在中缀运算符之前或之后放置一个参数来确定我们应用于哪个参数:

(`elem` word) === \char -> elem char word -- apply to second arg
(char `elem`) === \word -> elem char word -- apply to first arg
没有反引号的

elem只是一个常规的curry函数:

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

答案 3 :(得分:0)

(`op` val)是一个(IMO相当不错,因为反引号是如此不引人注意的阅读)flip op val的替代写作:它允许你在第二个而不是第一个参数中部分应用函数

这些运算符部分当然更常用于已经是中缀形式的函数,例如

  

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