带有Async和Option的F#程序流程问题

布赖恩·瓦莱伦加(Brian Vallelunga)

我正在努力解决如何在F#中完成以下任务的问题。以下是我要复制的简化的C#伪代码等效项。

var x = await GetXAsync();
if (x == null) return "not found";
var y = await GetYAsync(x);
return y;

我最初的F#版本看起来像:

task {
    let! x = GetXAsync()
    match x with
    | None -> // need to return a hard-coded value here
    | Some x` -> 
                 let! y = GetYAsync(x`)
                 // More code
                 // return some value based on y here
}

显然这很糟糕,但是我不确定如何进行。我应该在这里尝试完整的ROP风格的编程,还是有一些更简单的方法?

托马斯·佩特里切克(Tomas Petricek)

在您的示例中,您正在返回"not found"字符串,以表明某个函数出了问题,否则该函数返回了字符串。我不会这样做,因为很难区分一切正常的情况和无效的情况。

如果GetXAsync返回的事实null表明失败,那么我将使用异常。F#async对传播这些内容提供了很好的支持,您可以使用捕获它们try .. with在F#中使用异常来处理特殊情况并没有错!

exception InvalidX of string

let GetXAsync() = async { 
  // whetever code that calculates 'failed' and 'result' goes here
  if failed then raise (InvalidX "not found")
  return result }

然后,您可以调用函数,并且异常会自动传播。

async {
  let! x = GetXAsync() 
  let! y = GetYAsync(x)
  return y }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

F#中带有设置标志的线程问题

带有c#和f#项目的根文件夹中的Directory.Build.props导致问题

程序流程,带有逻辑的fork()

createUser和带有承诺的登录流程

关于带有日期和随机数的程序的问题

在F#中混合IObservable和Async <'a>

WPF的F#异步事件处理程序,类似于C#的async和await

F#中带有json.net的反序列化问题

带有 BigInteger 索引的 F# 序列

具有EF代码优先/持续集成问题的F#类型提供程序

带有IO :: Async和Future :: Utils的并发请求的Perl问题

带有Firebase和Chrome扩展程序的Goole Auth和Facebook Auth问题

当使用带有promise和appendChild的async / await时,应用程序停止工作

在F#中,带有强制构造函数参数的对象初始化程序语法是什么?

带有MVC,Ninject和WCF服务的控制台应用程序(处理问题?)

带有身份提供程序和 PKCE 的 Azure AD B2C 问题

带有事件处理程序和上下文/范围问题的 Es6 类

带有引导程序和日期选择器问题的free-jqgrid

F#详细语法和类定义问题

F#和COM API向下转换问题

不理解带有类型转换的 F# 语法

F# 带有可选递归组件的判别联合

在F#中正确使用带有指针的P /调用

F#管道函数执行流程

带有指标和维度的siteSpeedSampleRate问题

此F#代码有什么问题

具有递归功能的F#中的背包问题

具有延期问题的F#扩展Euclidian算法

F#事件和处理程序的类型参数是什么?