当前位置: 首页 > 知识库问答 >
问题:

函数组合依赖于部分应用吗?

司空默
2023-03-14
let updateCells (grid:Map<(int * int), Cell>) =

    grid |> Map.toSeq
         |> Seq.map snd
         |> Seq.fold (fun grid c -> grid |> setReaction (c.X, c.Y)) grid

let mutable _cells = ObservableCollection<Cell>( grid |> Map.toSeq
                                                      |> Seq.map snd
                                                      |> Seq.toList )
let cycleHandler _ = 

    self.Cells <- ObservableCollection<Cell>( grid |> cycleThroughCells
                                                   |> Map.toSeq
                                                   |> Seq.map snd
                                                   |> Seq.toList )

如果您注意到了,以下代码出现在所有三个函数中:

grid |> Map.toSeq
     |> Seq.map snd

功能组合

在函数式编程中,我们可以将函数融合在一起,这样它们就可以成为一个函数。

let getCells = Map.toSeq >> Seq.map snd >> Seq.toList
let updateCells (grid:Map<(int * int), Cell>) =

    grid |> Map.toSeq
         |> Seq.map snd
         |> Seq.fold (fun grid c -> grid |> setReaction (c.X, c.Y)) grid

并将其重构为:

let updateCells (grid:Map<(int * int), Cell>) =

    grid |> getCells
         |> Seq.fold (fun grid c -> grid |> setReaction (c.X, c.Y)) grid

我关于函数组合与部分应用程序耦合的想法是否准确?

共有1个答案

傅振濂
2023-03-14

实际上,如果你把表达式

let getCells = Map.toSeq >> Seq.map snd >> Seq.toList

并尝试将其编译为独立表达式,则会出现编译器错误:

错误FS0030:值限制。当'_a:comparation
时,'get cells'值被推断为具有泛型类型val getCells:(map<'_a,'_b>->'_b list);如果'_a:comparation
将'get cells'的参数设置为显式,或者如果不希望它是泛型的,则添加类型注释。

let getCells xs = xs |> Map.toSeq |> Seq.map snd |> Seq.toList

>>函数组合运算符使用的样式称为无点。它在部分应用程序中工作得很好,但并不完全相同。

但是,在这个例子中有一个部分函数应用的例子:

let getCells xs = xs |> Map.toSeq |> Seq.map snd |> Seq.toList

函数snd具有以下类型:

'a * 'b -> 'b

这个函数只接受一个参数。

您还可以编写上述getcells函数,而不部分应用snd函数:

let getCells xs = xs |> Map.toSeq |> Seq.map (fun x -> snd x) |> Seq.toList

请注意,您可以传递一个lambda表达式,而不是传递给seq.map的部分应用函数。getcells函数仍然是由其他函数组成的函数,但它不再依赖于snd的部分应用。

因此,为了部分(双关语)回答您的问题:函数组合不必依赖于部分函数组合。

在F#中,函数默认是curred的。这意味着所有函数都只接受一个参数,并返回一个值。有时(经常),返回值是另一个函数。

Seq.map snd
let getCells xs = xs |> Map.toSeq |> Seq.map snd |> Seq.toList

正如您所看到的,部分应用程序不是函数组合所必需的,但它确实使函数组合变得容易得多。

上述使用管道操作符(>)的组合仍然依赖于函数map.toseqseq.map等的部分应用。为了证明合成不依赖于部分应用,这里有一个“公正”(部分的反义词?(双关语))替代方案:

let getCells xs =
    xs
    |> (fun xs' -> Map.toSeq xs')
    |> (fun xs' -> Seq.map (fun x -> snd x) xs')
    |> (fun xs' -> Seq.toList xs')

请注意,该版本广泛使用了lambda表达式,而不是部分应用程序。

 类似资料:
  • 问题内容: 考虑Oracle表。我想用顶薪与获得职工和。还假定没有“ empno”列,并且主键涉及许多列。您可以使用以下方法执行此操作: 这可行,但我必须重复测试deptno = 20和job =’CLERK’,这是我想避免的。有没有更优雅的方式编写此代码,也许使用?顺便说一句,如果这很重要,我正在使用Oracle。 问题答案: 以下内容经过了精心设计,但对于“ top x”查询而言,这是一个很好

  • 我有一个POM,根据Maven的最佳实践,它应该对组件/系统的依赖项进行分组,以声明使用该组件/系统所需的任何依赖项。(只有分组本身是最佳实践;)) 正常情况下,此pom只将组件(在本例中为systemA)服务(接口)模块声明为作用域依赖项,并将其相应的实现模块声明为作用域依赖项,如下所示: (当然,服务模块的POM和实现模块的POM将声明对systemA模块的进一步依赖关系,例如systemA的

  • 主要内容:1. 平凡函数依赖,2. 非平凡的功能依赖DBMS函数依赖是两个属性之间存在的关系。它通常存在于表中的主键和非键属性之间。 函数依赖的左侧被称为决定因素,生产的右侧被称为依赖。 例如: 假设有一个包含属性的员工表:,,。 这里属性是唯一地标识表的属性,因为如果知道,就可以知道与这个属性关联的员工姓名。 函数依赖可以写成: 因此可以说在函数上依赖于。 函数依赖的类型 1. 平凡函数依赖 如果是的子集,则具有平凡的函数依赖性。 以下依赖关系也

  • 我的pom.xml 错误:

  • 我有两门课和。规则如下: 每个作业都有一个数字标识符。 每个作业有10个对应的任务。 每个任务都有一个数字标识符。 一个没有就不能存在。 我试图建立这两个类的类图。因为任务不能没有作业,所以我认为这是一个组合,这就是我如何构建类图: 但现在我感到困惑的是,如果这种关联实际上是依赖关系: 在这种情况下,我如何知道关系是组合关系还是依赖关系? 我已经按照Thomas Kilian的建议在类图中修复了组

  • 本文向大家介绍DBMS中的部分依赖,包括了DBMS中的部分依赖的使用技巧和注意事项,需要的朋友参考一下 什么是部分依赖? 当非素数属性在功能上依赖于候选键的一部分时,就会发生部分依赖。 第二范式(2NF)消除了部分依赖性。 让我们看一个例子- 示例 <StudentProject> 学生卡 项目编号 学生姓名 项目名 S01 199 凯蒂 地理位置 S02 120 奥利 集群探索 在上表中,我们有