gpt4 book ai didi

f# - 函数和方法

转载 作者:行者123 更新时间:2023-12-04 23:04:41 26 4
gpt4 key购买 nike

我对 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除非它“绑定(bind)”到列表或包装在匿名函数中(即 (fun (ls : 'a list) -> ls.filter) 有效地将 filter 方法转换回 list 上的函数)。

然而,即使有这个原因,直接调用操作的最常见情况似乎会偏爱方法,因为它们更简洁。所以我想知道是否还有其他原因。

编辑:

我的第二个猜测是功能特化。 IE。特化很简单 List.filter (例如 let evens List.filter isEven )。必须定义 evens 似乎更冗长。方法。

最佳答案

函数比方法更重要的是函数特化和它实现的简单分解。

这是涉及函数的示例表达式:

let square x = x * x

let isEven n = n % 2 = 0

[1 .. 10] |> List.filter isEven |> List.map square

让我们分解出一个名为 evens 的函数。过滤事件:
let evens = List.filter isEven

现在让我们分解出一个对整数列表求平方的函数:
let squarify = List.map square

我们原来的表达现在是:
[1 .. 10] |> evens |> squarify

现在让我们回到原来的基于方法的表达式:
[1 .. 10].filter(isEven).map(square)

在这种情况下,对偶数进行过滤并不是那么简单。

关于f# - 函数和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15103519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com