F#中中缀函数的部分应用

4
在Haskell中,可以使用sections部分应用中缀函数。例如,给定中缀函数<(小于),可以部分应用任何一个函数的参数:(5 <),(< 5)。
换句话说,在Haskell中,我们有以下速记符号:
op :: a -> b -> c
(`op` y) === \x -> x `op` y
(x `op`) === \y -> x `op` y

F#是否有类似的概念?
2个回答

5

不,除了标准的部分应用(如(=) x),这两者都不可以。


虽然我喜欢Seq.find ((=) x)的简洁性,但像Seq.filter ((<) 3)(甚至Seq.map (flip (-) 1))这样的表达式阅读起来很别扭,我认为应立即使用lambda表达式进行替换。


1
感谢您的迅速回答。只是因为我来自Haskell,其中filter (< 5) [1..10]会产生[1,2,3,4],所以在F#中List.filter ((<) 5) [1..10]返回[6;7;8;9;10]让我感到困惑! - primodemus
2
那就是我对“(非常)尴尬”的定义了 ;) - Sebastian Ullrich
1
primodemus: < 是一个运算符,所以你可以像这样写出来 (<) 5 10,它的意思和 5 < 10 是一样的。同样地,List.filter ((<) 5) 的意思和 List.filter (fun x -> 5 < x) 是一样的。我能理解将代码读作“过滤小于 5 的项目列表”是多么容易,但我不认为这是一个陷阱。 - Juliet

4
如果你想发明自己的标准...
let lsection x f y -> f x y
let rsection f y x -> f x y

那么 lsection 5 (<) === (5 <)rsection (<) 5 === (< 5)

不过,如果没有语言支持,只需在其中放入一个lambda函数即可更加清晰易懂。


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