F# 是否有更好的方法在F中的异步块内强制转换返回值#

F# 是否有更好的方法在F中的异步块内强制转换返回值#,f#,F#,我在一个小的F#项目中使用,需要将db.StringGetAsync()返回值转换为int。我找到了一种方法,如下所示: let! intFromRedis= async { let! value = db.StringGetAsync(key) |> Async.AwaitTask return int value } let! redisValue = db.StringGetAsync(key) |> Async.AwaitTask let intFromR

我在一个小的F#项目中使用,需要将db.StringGetAsync()返回值转换为int。我找到了一种方法,如下所示:

let! intFromRedis= async {
    let! value = db.StringGetAsync(key) |> Async.AwaitTask 
    return int value
}
let! redisValue = db.StringGetAsync(key) |> Async.AwaitTask
let intFromRedis = int redisValue
但如果能做这样的事情会更好:

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

有更好的语法吗?

正如评论中所指出的,从技术上讲,问题要求使用
Async.map
,其定义与问题中的代码类似

但我还是建议保持简单。在第二行上进行铸造将如下所示:

let! intFromRedis= async {
    let! value = db.StringGetAsync(key) |> Async.AwaitTask 
    return int value
}
let! redisValue = db.StringGetAsync(key) |> Async.AwaitTask
let intFromRedis = int redisValue
我甚至不确定
intFromRedis
是否比
intredisvalue
更具可读性。它几乎不短,后一种表达是不言自明的。因此,只保留第一行并使用
int redisValue
并没有真正的问题


使用稀有或自定义函数会降低可读性。强制转换(也可能是值绑定)非常简单、简短,任何阅读代码的程序员都应该知道发生了什么。

我不能在这里尝试,但是你不能在末尾添加
|>int
吗?@MarkPattison:类型'Async'不支持转换为类型'int'。也许你可以使用
Async.map
Tomas Petricek在这里描述的:Async.map示例成功了。请回答这个问题,以便我可以批准它。为什么不在第二行上转换为int,或者在使用值的地方转换为int?定义和使用
Async.map
仅仅是为了保存一行代码,听起来有点过分了。我同意
Async.map
是过分了。