问题标签 [fsharpx]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1076 浏览

f# - F#记录构造函数

有没有办法在 F# 中调用 F# 记录类型的构造函数?

我的动机是我一直在使用 FSharpx 的应用验证,但发现自己编写了许多只构建记录的样板函数。

buildAddress 函数例如在简单的样板中,如果可能的话,我很想摆脱它。

0 投票
1 回答
276 浏览

f# - 计算表达式与应用函子以及什么不是

不完全确定标题描述它没问题,但我确实有以下代码:

paket.依赖项:

一些.fsx:

这个“练习”的重点是编写 GetDB2,使其与 GetDB1 一样,但使用运算符(应用程序?),但我目前无法转过头来管理它。

上面的代码可以编译,但是GetDB1和GetDB2的签名不相等,我显然做的不对

我已经在 GetDB2 中尝试了几个版本和命令,但我或多或少总是以与上面相同的签名结束。

我最初的总体想法是编写小函数来做他们应该做的事情,然后添加异常处理(protect),然后相应地“包装”和“解包”。

当然,这也可能不是完全正确的想法。

有人可以在这里为我指明一些方向以进行进一步的研究、代码示例或其他任何东西吗?实际上,此时欢迎任何类型的任何评论;-)

FSharpx 文档

附录

我认为以下应该与上面大致相同,但没有 mongodb 依赖项。

0 投票
2 回答
203 浏览

functional-programming - 了解单子遍历的副作用

我正在尝试正确理解副作用在使用单子样式遍历 F# 列表时的工作原理,遵循 Scott 的指南here

我有一个 AsyncSeq 项目,以及一个可以返回 Result<'a,'b> 的副作用函数(它将项目保存到磁盘)。

我明白了一般的想法 - 拆分头部和尾部,将 func 应用于头部。如果它返回 Ok 然后通过尾部递归,做同样的事情。如果在任何时候返回错误,则将其短路并返回。

我也明白了为什么 Scott 的最终解决方案使用 foldBack 而不是 fold - 它使输出列表与输入保持相同的顺序,因为每个已处理的项目都附加在前一个之前。

我也可以按照逻辑:

  • 列表最后一项的结果(在我们使用折返时首先处理)将作为累加器传递给下一项。

  • 如果是 Error 并且下一项是 Ok,则丢弃下一项。

  • 如果下一项是错误,它将替换任何先前的结果并成为累加器。

  • 这意味着当您从右到左递归整个列表并在开始时结束时,您要么以正确的顺序对所有结果进行确定,要么获得最近的错误(这将是第一个如果我们从左到右发生)。

让我感到困惑的是,既然我们从列表的末尾开始,处理每个项目的所有副作用都会发生,即使我们只取回创建的最后一个错误?

这似乎在此处得到确认,因为打印输出以 [5] 开头,然后是 [4,5],然后是 [3,4,5] 等。

让我感到困惑的是,当我使用FSharpx库中的 AsyncSeq.traverseChoiceAsync (我包装它以处理结果而不是选择)时,这不是我所看到的。我看到副作用从左到右发生,在第一个错误处停止,这就是我想要发生的。

看起来 Scott 的非尾递归版本(不使用 foldBack 并且只是在列表上递归)从左到右?AsyncSeq 版本也是如此。这可以解释为什么我在第一个错误时看到它短路,但如果它完成 Ok 那么输出项肯定会反转,这就是我们通常使用折返的原因?

我觉得我误解或误读了一些明显的东西!有人可以向我解释一下吗?:)

编辑: rmunn 对下面的 AsyncSeq 遍历给出了非常全面的解释。TLDR 是

  • Scott 的初始实现和 AsyncSeq 遍历确实像我想的那样从左到右进行,因此只处理直到遇到错误

  • 它们通过将头部添加到已处理的尾部而不是将每个处理结果添加到前一个(这是内置的 F# fold 所做的)来保持内容有序。

  • foldback 会让事情井井有条,但确实会执行每个案例(异步序列可能需要很长时间)

0 投票
1 回答
97 浏览

f# - 如何使用 FSharpx 的 PersistentVector 从索引 N 中删除一个项目?

我注意到来自 FSharpX 的 PersistentVector 没有 remove at index 方法。

https://fsprojects.github.io/FSharpx.Collections/reference/fsharpx-collections-persistentvector-1.html

它可以修改第 n 个位置的项目,但不能删除它。这似乎是一个奇怪的遗漏。如果不可能,那么有人可以建议一个具有这种能力的不同的不可变持久集合。

我当前从向量中删除id处的项目的代码是蛮力

请注意,我正在尝试使用 PersistentVector 作为 UI 的后备存储。我正在试验https://github.com/JaggerJo/Avalonia.FuncUI,它是 Avalonia 的 Elmish 端口。我走了很远,然后想在一行上添加一个删除按钮,但我找不到更新我的后备存储的方法。:(

UI 的示例代码是

https://gist.github.com/bradphelan/77f3fcb8e660783790c5610290cd8d97