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

时间:2015-02-18 09:05:13

标签: f#

我在一个小型F#项目中使用StackExchange.Redis,我需要将db.StringGetAsync()返回值强制转换为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

这有更好的语法吗?

1 个答案:

答案 0 :(得分:2)

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

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

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

我甚至不确定intFromRedisint redisValue更具可读性。它只是短暂的,后一种表达方式是不言自明的。因此,仅保留第一行并使用int redisValue没有真正的问题。

使用稀有或自定义功能会降低可读性。一个演员 - 也许是一个值绑定 - 很简单,足够短,任何阅读代码的程序员都应该了解正在发生的事情。