有没有更好的方法在 F# 中的异步块中转换 return 值

Is there a better way to cast a return value inside an async block in F#

我在一个小型 F# 项目中使用 StackExchange.Redis,我需要将 db.StringGetAsync() return 值转换为 int。我找到了这样的方法:

let! intFromRedis= async {
    let! value = db.StringGetAsync(key) |> Async.AwaitTask 
    return int value
}

但是如果能够做这样的事情会更漂亮:

// Better syntax but it does not compile
let! intFromRedis : int = db.StringGetAsync(key) |> Async.AwaitTask

是否有更好的语法?

正如评论中指出的那样,从技术上讲,问题要求 Async.map,其定义类似于问题中的代码。

但我宁愿建议保持简单。在第二行投射将如下所示:

let! redisValue = db.StringGetAsync(key) |> Async.AwaitTask
let intFromRedis = int redisValue

而且我什至不确定 intFromRedis 是否比 int redisValue 更具可读性。它几乎没有更短,后一种表达是不言自明的。因此,只保留第一行并使用 int redisValue.

没有真正的问题

使用稀有或自定义函数会降低可读性。强制转换——也许还有值绑定——很简单,足够短,任何阅读代码的程序员都应该明白发生了什么。