在haskell中结合交换和配对函数

the*_*ord 1 haskell

我对 Haskell 很陌生,我已经开始阅读《Haskell 编程》一书。我遇到了一个名为 swap 的函数

swap (x,y) = (y,x) 
Run Code Online (Sandbox Code Playgroud)

和函数对。

pair x y = (x,y) 
Run Code Online (Sandbox Code Playgroud)

然后我开始想知道是否有可能像这样将这两个功能结合起来

swapPair x y = (y,x) 
Run Code Online (Sandbox Code Playgroud)

并使用两个优先函数作为帮助函数。

lef*_*out 5

最明显的方法是

swapPair x y = swap (pair x y)
Run Code Online (Sandbox Code Playgroud)

这与以下相同

swapPair x y = swap $ pair x y
Run Code Online (Sandbox Code Playgroud)

因为y只出现在两边的末尾,所以可以进行eta-reduced。这需要将应用程序运算符更改为复合运算符:

swapPair x = swap . pair x
Run Code Online (Sandbox Code Playgroud)

正如 Willem Van Onsem 所展示的那样,这可以完全无积分。我不建议这样做,但它的工作原理如下:您首先考虑运算.符本身是一个应用于某些参数的函数

swapPair x = (.) swap (pair x)
Run Code Online (Sandbox Code Playgroud)

那么这可以再次写成一个组合:

swapPair x = (.) swap . pair $ x
Run Code Online (Sandbox Code Playgroud)

eta减少

swapPair = (.) swap . pair
Run Code Online (Sandbox Code Playgroud)

最后可以应用运算符部分语法:

swapPair = (swap .) . pair
Run Code Online (Sandbox Code Playgroud)

  • 只是给它一个名字,虽然它不常用,但它已经流传了很长时间 `(.:) = (.) 。(.)` 它可以被定义为 `swap .:pair`。我最近发现 [Agda 能够使用 mixfix 运算符定义它“交换 ◦ ◦ 对”](https://gist.github.com/Icelandjack/2eb99db6a1ab904b709571f1e9cd36b4)。这不需要定义越来越多的运算符。 (2认同)