我对 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)
并使用两个优先函数作为帮助函数。
最明显的方法是
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)
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |