带有中缀函数的偏应用

2024-01-09

虽然我对数学意义上的柯里化有一些了解,但部分 应用中缀函数是我潜水后发现的一个新概念 进书里为大善而学 Haskell http://learnyouahaskell.com/.

给定这个函数:

applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)

作者以一种有趣的方式使用它:

ghci> applyTwice (++ [0]) [1]  
[1,0,0]
ghci> applyTwice ([0] ++) [1]
[0,0,1]

在这里我可以清楚地看到生成的函数有不同的参数 通过了,考虑到它是柯里化的,通过正常方式不会发生这种情况 功能(会吗?)。那么,中缀切片有什么特殊处理吗? 哈斯克尔?它对所有中缀函数通用吗?


附带说明一下,这是我使用 Haskell 和函数式编程的第一周, 我还在读这本书。


是的,您可以通过指定其左操作数或右操作数来部分应用中缀运算符,只需将另一个操作数留空(正是在您编写的两个示例中)。

So, ([0] ++)是相同的(++) [0] or \x -> [0] ++ x(请记住,您可以通过括号将中缀运算符转换为标准函数),而(++ [0])等于\x -> x ++ [0].

了解反引号 (``) 的用法也很有用,它使您能够在中缀运算符中使用两个参数来转换任何标准函数:

Prelude> elem 2 [1,2,3]
True
Prelude> 2 `elem` [1,2,3] -- this is the same as before
True
Prelude> let f = (`elem` [1,2,3]) -- partial application, second operand
Prelude> f 1
True
Prelude> f 4
False
Prelude> let g = (1 `elem`) -- partial application, first operand
Prelude> g [1,2]
True
Prelude> g [2,3]
False
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有中缀函数的偏应用 的相关文章

随机推荐