首页 > 解决方案 > 如何在 F# 的同一行上获取 Json 元素的字符串值

问题描述

我有一些代码我想放在同一行而不是单独的变量(也许是管道?)

    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)

我可以看到正在发生的事情 - 在函数点,变量仍然是异步的。我怎样才能让它通过管道将结果传递给同一行上的函数?

标签: f#

解决方案


我不明白你为什么要这样做。当代码写成两行时,它是完全可读和简洁的。将其压缩为一行只会使其更难理解。

也就是说,如果您想这样做,最好的选择是对or进行map操作。这存在于各种库中,但您也可以轻松地自己定义它:Async<T>Task<T>

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())

但正如我上面所说,我认为这是一个坏主意,你的两行版本更好。


推荐阅读