使用 F# 中的 Applicative 功能构建记录

2023-12-23

假设有一个type r = {A : int; B : string; C : int; D : string}和一些值:

let aOptional : int option = ...
let bOptional : string option = ...
let cOptional : int option = ...
let dOptional : string option = ...

How can r optional可以用它们优雅地构建(没有嵌套的案例等)?


顺便说一句,这是如何在 haskell 中完成的Control.Applicative http://hackage.haskell.org/package/base-4.6.0.0/docs/Control-Applicative.html:

data R = R { a :: Integer, b :: String, c :: Integer, d :: String}

R <$> aOptional <*> bOptional <*> cOptional <*> dOptional :: Maybe R

在 fsharp 中寻找等效的东西。


我知道的唯一方法(使用应用程序)是创建一个函数来构造记录:

let r a b c d = {A = a; B = b; C = c; D = d}

然后你可以这样做:

> r </map/> aOptional <*> bOptional <*> cOptional <*> dOptional ;;

val it : R option

您可以定义map and <*>你自己,但如果你想要一个通用的实现,请尝试使用该代码F#+ https://github.com/gmpl/FSharpPlus或者如果你想使用控制系统 https://github.com/gmpl/FsControl直接可以这样写代码:

#r "FsControl.Core.dll"

open FsControl.Operators

let (</) = (|>)
let (/>) f x y = f y x

// Sample code
type R = {A : int; B : string; C : int; D : string}
let r a b c d = {A = a; B = b; C = c; D = d}

let aOptional = Some 0
let bOptional = Some ""
let cOptional = Some 1
let dOptional = Some "some string"

r </map/> aOptional <*> bOptional <*> cOptional <*> dOptional
// val it : R option = Some {A = 0; B = ""; C = 1; D = "some string";}

UPDATE: Nuget 包 https://www.nuget.org/packages/FsControl/现在可用。

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

使用 F# 中的 Applicative 功能构建记录 的相关文章

  • 如何让 do 块提前返回?

    我正在尝试使用 Haskell 抓取网页并将结果编译到一个对象中 如果出于某种原因 我无法从页面获取所有项目 我想停止尝试处理页面并提前返回 例如 scrapePage String gt IO scrapePage url do doc
  • Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

    以下值 表达式 函数的 thunk 在 Haskell 堆中是什么样子的 val 5 is val a pointer to a box containing 5 add x y x y result add 2 val main prin
  • 管道 - 将多个来源/生产者合并为一个

    我正在使用读取文件sourceFile 但我还需要在处理操作中引入随机性 我认为最好的方法是拥有一个这样的制片人 Producer m StdGen ByteString 其中 StdGen 用于生成随机数 我打算让生产者执行 source
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • Python 比编译的 Haskell 更快?

    我有一个用 Python 和 Haskell 编写的简单脚本 它读取包含 1 000 000 个换行符分隔的整数的文件 将该文件解析为整数列表 对其进行快速排序 然后将其写入已排序的不同文件中 该文件与未排序的文件具有相同的格式 简单的 这
  • F# 匹配 ->

    我想做类似的东西 Nemerle 语法 def something match STT 1 with st Summ 2 with st AVG gt st summbycol counter STT 在 F 上 那么 F 是真的吗 没有对
  • 检索 Haskell 项目中所有导入的列表

    因此 我的最终目标是通过确保项目导入的所有实体都存在于其声称可以使用的版本中 来评估 cabal 文件中依赖项的准确性 一个好的开始是找到单个源文件使用的所有导入实体的列表 可选地包含有关它们来自何处的信息 我愿意暂时忽略类实例的情况 因为
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • 如何忽略异步块中异步函数的返回值?

    The m1 and m2以下函数中存在编译错误 let m p async return p 2 let m1 async do m 2 ERR was expected int but here has type unit let m2
  • Async.AwaitTask 在 f# 中如何工作?

    我知道 f 和 c 异步模型之间的主要区别在于 在 f 中 除非您调用 Async RunSynchronously 之类的内容 否则异步执行不会开始 在 C 中 当方法返回任务时 通常 并非总是 立即在后台线程中开始执行 Async Aw
  • Haskell 中的“修复”是什么?为什么“修复错误”会打印无限字符串?为什么“拿 10 美元修复错误”也有同样的作用?

    长话短说 我在看西蒙 佩顿 琼斯的演讲 https www youtube com watch v re96UgMk6GQ 并且当时21 41 https youtu be re96UgMk6GQ t 1301他引用了一句话 我正在解决一个
  • 将可区分的联合传递给 InlineData 属性

    我正在尝试对一个解析器进行单元测试 该解析器解析字符串并返回相应的抽象语法树 表示为可区分的联合 我认为使用 Xunit Extensions 属性会非常紧凑InlineData将所有测试用例堆叠在一起
  • 为什么对本地列表求和比用“GHC -O2”对教会编码列表求和慢?

    为了测试教会编码的列表如何针对用户定义的列表和本机列表执行 我准备了 3 个基准测试 用户定义的列表 data List a Cons a List a Nil deriving Show lenumTil n go n Nil where
  • 如何在.NET Core上直接调用F#编译器?

    UPD 我想直接从 NET Core SDK 调用 F 编译器 即 fsc 我了解 dotnet build co 但当我只需要编译一个简单的问题时 即 fsc file fs 就足够的情况下 我不想涉及它们 我尝试在 NET Core S
  • GHC 8.4 系列的插件名称查找行为发生变化

    更新 原来这是一个 GHC 错误 现已修复 预计在 8 6 4 版本中发布 https ghc haskell org trac ghc ticket 16104 comment 8 https ghc haskell org trac g
  • 不理解 Monoid 定义中态射的表示法

    我试图理解什么Monoid是从范畴论的角度来看的 但我对用来描述它的符号有点困惑 这是维基百科 在范畴论中 幺半群范畴 C I 中的幺半群 或幺半群对象 M 是一个对象 M 和两个态射 M M M 称为乘法 I M 称为单位 我的困惑在于态
  • Haskell 有 takeUntil 函数吗?

    目前我正在使用 takeWhile x gt x 1 x 89 l 从列表中获取最多为 1 或 89 的元素 但是 结果不包括这些标记值 Haskell 是否有一个标准函数可以提供这种变化takeWhile结果中包含哨兵 到目前为止 我对胡
  • 带有参考的 Haskell 数据类型

    我正在实现 Ukkonen 的算法 该算法要求树的所有叶子都包含对同一整数的引用 并且我在 Haskell 中执行此操作是为了了解有关该语言的更多信息 但是 我很难编写出执行此操作的数据类型 Node has children indexe
  • 在不同上下文中使用的多态变量 haskell

    我有以下一段 Haskell 代码 foo Num a gt a gt a gt Either Integer Double gt Either Integer Double foo f x case x of Left i gt Left
  • 非单射封闭型族

    我确实有一段人为设计的代码 LANGUAGE DataKinds TypeFamilies data Foo Foo type family Id n Foo a where Id Foo a a data Bar n Foo Bar cl

随机推荐