我对 F# 很陌生。我注意到的第一件事是集合操作被定义为函数而不是方法。
作为一个实验,我定义了几个方法list
:
type List<'a> with
member this.map f = List.map f this
member this.filter f = List.filter f this
然后,给定这些助手:
let square x = x * x
let isEven n = n % 2 = 0
这是使用这些方法的示例:
[1 .. 10].filter(isEven).map(square)
这是传统的方式:
[1 .. 10] |> List.filter isEven |> List.map square
所以简洁显然不是选择函数而不是方法的理由。:-)
从库设计的角度来看,为什么选择函数而不是方法?
我的猜测是,这是因为您可以传递List.filter
,但不能真正传递该filter
方法,除非它“绑定”到列表或包装在匿名函数中(即(fun (ls : 'a list) -> ls.filter)
有效地将filter
方法转换回函数 on list
)。
然而,即使有这个原因,直接调用操作的最常见情况似乎会偏爱方法,因为它们更简洁。所以我想知道是否还有其他原因。
编辑:
我的第二个猜测是功能专业化。即专业化很简单List.filter
(例如let evens List.filter isEven
)。evens
必须定义一个方法似乎更冗长。