f# - 如何在 F# 中使用 Akka.Streams.*.ConcatMany?
问题描述
我想创建一个流,从传入的元素中创建一个新的源(它将是一个持久性查询),然后将结果展平。像这个简化的例子:
var z = Source.Single(1).ConcatMany(i => Source.Single(i));
此代码按预期编译和工作。我的问题是,当我将它翻译成 F# 时:
let z = Source.Single(1).ConcatMany(fun i -> Source.Single(i))
我收到一条错误消息
This expression was expected to have type
'IGraph<SourceShape<'a>,Akka.NotUsed>'
but here has type
'Source<int,Akka.NotUsed>'
我认为其原因是 F# 处理协/逆变的方式与 C# 不同,并且不能简单地转换这些通用专业化(https://github.com/fsharp/fslang-suggestions/issues/162),但我无法弄清楚在 anint
和 a之间进行转换的方法SourceShape<int>
。是否可以将此示例转换为 F#?
解决方案
查看GitHub 上的代码,它似乎Source<TOut, TMat>
是 的直接实现IGraph
,因此您应该能够转换它:
public sealed class Source<TOut, TMat> : IFlow<TOut, TMat>, IGraph<SourceShape<TOut>, TMat>
let z = Source.Single(1).ConcatMany(fun i -> Source.Single(i) :> IGraph<SourceShape<int>,Akka.NotUsed>)
我认为 C# 和 F# 用法之间的最大区别在于 C# 会自动为您进行向上转换。
推荐阅读
- javascript - 在 reactjs 应用程序的构建版本中分配给常量变量
- php - 来自 Godaddy 服务器的 Laravel 8 中的电子邮件发送时间
- javascript - 在浏览器(react-router-dom)中直接输入url时如何修复404错误?
- python - 投票未保存
- c# - 在运行时通过字符串修改包含在动态对象中的字典
- mysql - 保存和检索日期时间到 mysql 日期时间,它使用 TypeOrm,NestJs | 存储前一天的日期 节点
- java - 我可以将 XML 文件存储在 jar 文件中吗?
- ios - 在 Swift 中使用 EventKit 框架或为预订屏幕使用自定义 UI
- python - 在python的目录中解压.bz2文件
- javascript - 使用 Auth0 在 Vercel 上部署:无法解析“/vercel/path0/pages”中的“@auth0/nextjs-auth0”