【问题标题】:Combining swap and pair function in haskell在haskell中结合交换和配对功能
【发布时间】:2021-10-11 19:36:08
【问题描述】:

我对haskell 很陌生,我已经开始阅读“在haskell 中编程”这本书。我遇到了一个叫做swap的函数

swap (x,y) = (y,x) 

和函数对。

pair x y = (x,y) 

然后我开始怀疑是否可以像这样将这两个功能结合起来

swapPair x y = (y,x) 

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

【问题讨论】:

  • 下面的答案提供了几种选择,包括一些所谓的“无点风格”。但是,如果您是初学者,我建议您只关注最简单、直接的组合 swapPair x y = swap (pair x y),而忽略更高级的选项,这些选项实际上并不能提高可读性和性能。
  • 有一个基本的 Haskell 高阶函数,名为 curry,类型为 ((a, b) -> c) -> a -> b -> c。它接受一个[使用元组并返回某物的函数]并返回一个[使用元组的第一个元素并返回一个[使用元组的第二个元素并返回某物的函数]]的函数。 swapPaircurry swap

标签: haskell


【解决方案1】:

最明显的方法是

swapPair x y = swap (pair x y)

相同
swapPair x y = swap $ pair x y

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

swapPair x = swap . pair x

正如 Willem Van Onsem 所展示的,这可以完全没有意义。我不建议这样做,但它是这样工作的:您首先认为 . 运算符本身就是一个应用于某些参数的函数

swapPair x = (.) swap (pair x)

那么这又可以写成作文了:

swapPair x = (.) swap . pair $ x

eta-减少

swapPair = (.) swap . pair

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

swapPair = (swap .) . pair

【讨论】:

  • 只是给它起个名字,虽然不常用,但已经流传很久了(.:) = (.) . (.)可以定义为swap .: pair。我最近发现 Agda has the ability to define it swap ◦ ◦ pair 使用 mixfix 运算符。这不需要定义越来越多的运算符。
【解决方案2】:

您可以将这些用于:

swapPair :: a -> b -> (b, a)
swapPair = (swap .) . pair

因此,我们首先将这两个参数传递给pair 以创建一个二元组,然后我们将swap 应用于该二元组。

但我们可以在没有swappair 的情况下做到这一点,只需使用:

swapPair :: a -> b -> (b, a)
swapPair = flip (,)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多