我必须在Haskell中创建一个布尔函数,它接收一个单词(String)和一个字符列表。该函数必须验证列表中的所有字符都包含在字符串中。我做了一些研究,发现函数all
和elem
可能会有所帮助。
示例:
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
答案 0 :(得分:6)
(`elem` word)
是部分应用第二个参数的运算符部分,相当于\x -> elem x word
而elem 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]