我缺少什么:可以使用多个参数进行函数组合吗?

2024-05-02

我了解 F# 中函数组合的基础知识,例如所述here http://blogs.msdn.com/b/chrsmith/archive/2008/06/14/function-composition.aspx.

不过,也许我错过了一些东西。这>> and <<运算符似乎是在每个函数仅采用一个参数的假设下定义的:

> (>>);;
val it : (('a -> 'b) -> ('b -> 'c) -> 'a -> 'c) = <fun:it@214-13>
> (<<);;
val it : (('a -> 'b) -> ('c -> 'a) -> 'c -> 'b) = <fun:it@215-14>

然而,我想做的事情如下:

let add a b = a + b
let double c = 2*c
let addAndDouble = add >> double   // bad!

但即使add的输出是所需的类型double的输入,即被拒绝。

我知道我可以用一个元组参数重写 add :

let add (a,b) = a + b

或者我可以为第一个函数的每个可能参数编写一个新运算符:

let inline (>>+) f g x y = g (f x y)
let doubleAdd = add >>+ double

但这似乎很愚蠢!有我错过的更好的方法吗?


您想要的并非完全不合理,但无法在 F# 的类型系统中指示广义组合运算符的类型。就是没有什么好的办法统一

(>>) : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c

and

(>>+) : ('a -> 'b -> 'c) -> ('c -> 'd) -> 'a -> 'b -> 'd

(更不用说无限多个更高数量的版本)。因此,您别无选择,只能定义自己的附加运算符。在实践中,我经常发现以“尖头”风格编写的代码let f x y = add x y |> double比无点/“无意义”更具可读性let f = add (>>+) double anyway.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我缺少什么:可以使用多个参数进行函数组合吗? 的相关文章

  • 如何不使用 Do 符号来书写

    我正在研究可组合的失败 并设法编写了一个具有签名的函数 getPerson IO Maybe Person 其中一个人是 data Person Person String Int deriving Show 它有效 我将其写在 do 符号
  • 如何使用非类型化语言中的 Reader Monad 在整个组合中隐式地线程化参数?

    我知道裸读者单子仅包含两个功能 const chain g gt f gt x gt f g x x const of x gt gt x 但我对它如何工作或如何应用没有任何直觉 知道 is 用于在整个组合中隐式地线程化参数并没有多大帮助
  • 不可变数据结构性能

    我不明白作为一个集合的东西怎么可能是不可变的并且仍然具有可接受的性能 根据我在 F Sets 中读到的内容 内部使用红黑树作为其实现 如果每次我们想要向红黑树添加新内容时 我们基本上都必须重新创建它 那么它如何才能具有良好的性能呢 我在这里
  • 在 F# 中设置 ViewBag 动态对象的属性

    我在 C 中有这个操作方法 public ActionResult Index ViewBag Message Hello return View 这个视图 Index cshtml h2 ViewBag Message h2 这会在页面上
  • F# 中的组总计 - 使用序列很容易,可以使用列表吗?

    给定一组 id value 元组序列 很容易计算组总数 与使用 C 和 LINQ 执行此操作的方式几乎相同 let items g1 5 g2 10 g1 20 let groupsums items gt Seq groupBy fun
  • 在 F# 中实现返回 Task 的 C# 方法

    我正在 F 中创建一个类型 该类型继承自 C 类 该类公开返回的方法Task
  • 在 Blazor 中显示计时器

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我
  • FParsec:如何组合解析器以便它们以任意顺序匹配

    任务是找到特定的键值对并解析它们 这些对可以按任何顺序出现 我的部分工作尝试 open FParsec type Parser lt a gt Parser lt a unit gt type Status Running Done typ
  • 如何在 FsCheck 中注册任意实例并让 xUnit 使用它?

    我有一个类型Average有一个字段count这是积极的int64 and a double字段称为sum 我做了一个任意的生成有效实例的操作 let AverageGen Gen map2 fun s c gt Average float
  • F# 2010 Seq.generate_using

    Visual Studio 2010 中的 Seq generate using 是否有替代 解决方法 FSharp PowerPack dll 不适用于 2010 AFAIK 很抱歉 2010 年的 PowerPack 尚未上市 我不记得
  • 关于 MEF 战略和结构的问题

    我的任务是模块化一个 C 应用程序 该应用程序是一个非常大的 Delphi 应用程序的重写 数据库有 249 个表 业务限制禁止对 NET 进行彻底的重新设计和更好的整体架构 因此我们基本上只是用 C 逐步重写 Delphi 应用程序的模块
  • 如何在 F# 中将对象转换为泛型类型列表

    在下面的代码片段中 我的目的是将 System Object 可能是 FSharpList 转换为它所持有的任何泛型类型的列表 match o with list lt gt gt addChildList o gt list lt gt
  • 按属性值选择 XML 节点

  • 通用高阶函数

    当我将泛型函数作为本地值传递时 但在作为参数传递时却不能使用具有不同类型参数的泛型函数时 是否有原因 例如 let f id let g x y f x f y g 1 2 工作正常 但如果我尝试将函数作为参数传递 let g f x y
  • `ImmutableSortedSet` 和 fsharp `Set` 有什么区别?

    BCL引入了一组Immutable Collections http blogs msdn com b bclteam archive 2012 12 18 preview of immutable collections released
  • 使用 SqlBulkCopy 和 F# 在 SQL 中导出矩阵

    我想将大量数据从 F 传输到 SQL 表 基本上我的 F 代码创建了一个三列矩阵 UserID ProductID and price 和N行 我想将其 复制 粘贴 到数据库中 我尝试了多种选择 但最终 从 F 传输数据非常慢 10000
  • 从 C# 调用高阶 F# 函数

    给定 F 高阶函数 在参数中采用函数 let ApplyOn2 f int gt int f 2 和 C 函数 public static int Increment int a return a 我怎么打电话ApplyOn2 with I
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • 在 F# 类型提供程序中发出生成的类型

    我创建了一个简单的生成类型提供程序 它采用重新组织类型的程序集的路径 将它们置于类型提供程序命名空间下 如果您愿意 可以说是内部化 相关代码的链接在这里https github com colinbull Playground https

随机推荐