如何在 F# 的同一行获取 Json 元素的字符串值
How to get the String Value of a Json element on the Same line in F#
我有一些代码想放在同一行而不是有单独的变量(也许是管道?)
let! creditText = row.EvalOnSelectorAsync("div.moneyout","node => node.innerText") |> Async.AwaitTask
let JSonElementString = creditText.Value.GetString()
我想要这样的东西:
let! creditText = row.EvalOnSelectorAsync("div.moneyout","node => node.innerText") |> Async.AwaitTask |> (fun js -> js.Value.GetString)
我可以看到发生了什么 - 在函数点,变量仍然是异步的。我怎样才能让它通过管道将结果传递给同一行上的函数?
我不明白你为什么要这样做。当代码写成两行时,代码可读性和简洁性都很好。把它压缩成一行只会让它更难理解。
就是说,如果您想这样做,最好的选择是对 Async<T>
或 Task<T>
进行 map 操作。这存在于各种库中,但您也可以轻松地自己定义它:
module Async =
let map f a = async {
let! r = a
return f a }
使用这个,你现在可以写:
let! creditText =
row.EvalOnSelectorAsync("div.moneyout","node => node.innerText")
|> Async.AwaitTask
|> Async.map (fun creditText -> creditText.Value.GetString())
但正如我上面所说,我认为这是个坏主意,你的两行版本更好。
我有一些代码想放在同一行而不是有单独的变量(也许是管道?)
let! creditText = row.EvalOnSelectorAsync("div.moneyout","node => node.innerText") |> Async.AwaitTask
let JSonElementString = creditText.Value.GetString()
我想要这样的东西:
let! creditText = row.EvalOnSelectorAsync("div.moneyout","node => node.innerText") |> Async.AwaitTask |> (fun js -> js.Value.GetString)
我可以看到发生了什么 - 在函数点,变量仍然是异步的。我怎样才能让它通过管道将结果传递给同一行上的函数?
我不明白你为什么要这样做。当代码写成两行时,代码可读性和简洁性都很好。把它压缩成一行只会让它更难理解。
就是说,如果您想这样做,最好的选择是对 Async<T>
或 Task<T>
进行 map 操作。这存在于各种库中,但您也可以轻松地自己定义它:
module Async =
let map f a = async {
let! r = a
return f a }
使用这个,你现在可以写:
let! creditText =
row.EvalOnSelectorAsync("div.moneyout","node => node.innerText")
|> Async.AwaitTask
|> Async.map (fun creditText -> creditText.Value.GetString())
但正如我上面所说,我认为这是个坏主意,你的两行版本更好。