将中缀应用程序的`flip`参数内联。

7

给定一个用于中缀使用的函数:

let f a b = (a+10, b)
f 4 5
=> (14,5)
4 `f` 5
=> (14,5)

可以通过定义一个辅助函数来翻转参数:
let g = flip f
4 `g` 5
=> (15,4)

这个能够内联执行吗?

4 `flip f` 5
=> parse error on input `f'
4 `(flip f)` 5
=>  parse error on input `('

我的使用场景是 Control.Arrow.first。不同于

(+10) `first` (7,8)
(17,8)

我更倾向于使用前向应用程序风格解决方案,例如:
(7,8) `forwardFirst` (+10)

不需要编写代码即可实现
let forwardFirst = flip first

1
你想要这样做的使用情况是什么,考虑到你已经定义了 g - shree.pat18
2
刚刚添加了我的使用案例。 :) - Tobias Hermann
1
这不是对你问题的直接回答,但你可以使用 lens 写成 (7,8) & _1 %~ (+10)。当然,你也可以直接使用 &,写成 (7,8) & first (+10)。这是否与你想要的类似? - snak
是的,这看起来不错,但是将Lens作为那么小的东西的依赖关系似乎有点困难。 - Tobias Hermann
1
编写一个小的辅助函数绝对比添加依赖更好 :) - Yuuri
1
我同意,但仅仅定义 (&) = flip ($) 并将其用作 (7,8) & first (+10) 比定义每个函数的翻转版本更好。 - snak
1个回答

1

正如HaskellWiki关于中缀运算符的文章中所述,

请注意,您通常只能使用接受两个参数的函数来执行此操作。实际上,对于接受超过两个参数的函数,您也可以这样做,但不太方便。

在您的情况下,执行此操作的方法类似于以下内容:

let f a b = (a+10, b)
let h a b = (f `flip` a) b
let a = 3
let b = 2
f a b = (13,2)
a `h` b = (12,3)

通过 g = flip fh a b = (f 'flip' a) b,这两个函数是相同的。那么更复杂的版本 h 有什么优势呢? - Tobias Hermann
公平的观点。但我并不确定是否有更好的方法来完成你想要的事情。 - shree.pat18

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接