有没有更好的方法在 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
.
没有真正的问题
使用稀有或自定义函数会降低可读性。强制转换——也许还有值绑定——很简单,足够短,任何阅读代码的程序员都应该明白发生了什么。
我在一个小型 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
.
使用稀有或自定义函数会降低可读性。强制转换——也许还有值绑定——很简单,足够短,任何阅读代码的程序员都应该明白发生了什么。