F#风格 - 更喜欢()还是<|?

3

你更常使用哪种方式,哪一种更符合“惯用语”?

  1. f arg (obj.DoStuff())
  2. f arg <| obj.DoStuff()

+1 因为我甚至不知道 <| ;) - Dario
4个回答

5

总的来说,我不知道哪个更符合惯用语。

个人而言,我只有在使用"raise"时才使用<|。

raise <| new FooException("blah")

除此之外,我总是使用括号。请注意,由于大多数 F# 代码使用柯里化函数,这通常不意味着任何“额外”的括号:
f arg (g x y)

当你涉及到非柯里化函数、构造函数等等时,代码就变得不那么美观了:

f arg (g(x,y))

我们可能会至少考虑改变F#语言规则,使高优先级应用程序绑定更紧密;目前

f g()

解析的方式类似于
f g ()

但是很多人希望它能够解析为:
f (g())

(原问题中的动机案例)。如果您对此有强烈的意见,请在此回复中留言。

阅读了FSHub上的这篇文章以及以下帖子之后,http://cs.hubfs.net/forums/thread/3665.aspx http://cs.hubfs.net/forums/thread/5421.aspx 我会尽快找到一支笔签署“使f g()像f(g())一样解析”的请愿书! “修复”这个问题将使框架的使用更加美观。 - Torbjörn Gyllebring
我也希望看到 f g() 能像 f (g()) 一样解析,以使从框架中使用方法调用更加自然。但是,考虑到我们已经发布了生产版本,我担心现在为时已晚... - Stephen Swensen
实际上仍然有可能进行更改;该语言区分“应用程序”(g x)和“高优先级应用程序”(g(x),括号内没有空格),因此无论 f 接受 1 个还是 2 个柯里化参数,f g(x) 今天都不会编译通过(f g (x) 将 2 个参数传递给 f,而 f (g(x)) 则将一个参数传递给 f)。因此,未来版本的语言可以“允许更多合法程序”作为非破坏性更改。但这将非常微妙(使空格对不同的合法程序具有意义),因此不太可能发生。 - Brian

2
因为类型推断是从左到右工作的,使用|>的另一个好处是它允许F#推断函数参数的类型。
举个假设的例子,
[1; 2; 3] |> (fun x -> x.Length*2)

功能正常,但

(fun x -> x.Length*2) [1; 2; 3]

抱怨“在不确定类型的对象上查找”。


0

我经常使用 (),但那只是个人喜好,我相信 <| 更符合惯用语法,但我出于习惯使用 ()。


Rayne,最近我开始学习F#。你是用它进行商业开发还是只是为了好玩?我对实际应用F#非常感兴趣。 - aku
目前只是为了好玩,但它非常适合现实世界的应用,这种语言非常优美。它可以被用于与C#差不多相同的程度,只是更加简洁、优雅和易读的代码! - Rayne
Rayne,同意。我真的很喜欢它。希望他们能尽快给我们发布RTM版本。 - aku
我在工作中使用它来自动化性能测试并编写实用程序和脚本。希望它能够得到更多的关注。 - Torbjörn Gyllebring

0
尽可能地,我更喜欢使用 |>,因为它从左到右阅读。

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