【发布时间】:2021-12-31 13:38:07
【问题描述】:
我在LanguageExt 中使用TryAsync monad,但在尝试将多个绑定在一起时遇到了困难。我仍在学习函数式编程,因此可能完全错误地这样做。请随时在此处对我的方法的任何部分发表评论。
假设我有以下调用 Google Drive API 的方法...
TryAsync<File> GetFolder(string folderId)
TryAsync<string> CreateFolder(string folderName, string parentFolderId)
TryAsync<string> UploadFile(Stream file, string fileName, string mimeType, string folderId)
...其中File 是 Google 驱动器中文件/文件夹的 Google 类型。
我可以单独调用每一个,没问题,并且可以使用Match 来处理结果。
但是,有时我想调用多个,比如获取特定文件夹的File 对象,然后创建一个新的子文件夹并将文件上传到它。我知道我可以这样做(空气代码,所以请忽略任何拼写错误)...
(await GetFolder("123"))
.Match(async folder => {
(await CreateFolder("New folder", folder.Id))
.Match(async newFolder => {
(await UploadFile(stream, "New file name.txt", "text/text", newFolder.Id))
.Match(fileId => /* do whatever with the uploaded file's Id */, ex => /* report exception */);
}, ex => /* report exception */);
}, ex => /* report exception */);
如您所见,这非常痛苦。我确信你应该能够将 monad 链接在一起,我认为使用 Bind,所以你最终会得到更像这样的东西(再次,空气代码)......
(await GetFolder("123"))
.Bind(folder => CreateFolder("New folder", folder.Id))
.Bind(newFolder => UploadFile(stream, "New file name.txt", "text/text", newFolder.Id))
.Match(fileId => /* do whatever with the uploaded file's Id */, ex => /* report exception */);
但是,我无法像这样编译任何代码。
一个问题是我不确定我的方法是否有正确的签名。他们应该返回Task<T>,并让调用代码使用TryAsync<T>,还是让方法本身返回TryAsync<T>是正确的?
谁能告诉我应该怎么做?谢谢
【问题讨论】:
标签: c# functional-programming monads language-ext