【问题标题】:printfn in pipeline管道中的 printfn
【发布时间】:2011-03-03 23:59:14
【问题描述】:

所以我有一个函数 SolveEquasion,它返回一对 float*float[]。打印数字和数组并继续使用数组的最佳方法是什么?我做了以下代码,但似乎有更好的方法

...
|> SolveEquasion
|> (fun (det, solution) -> printfn "Determinant = %f\nSolution = %A" det (Array.toList solution), solution )
|> snd

【问题讨论】:

  • 当您说“继续使用数组”时,您的意思是通过管道将它传递给其他函数吗?

标签: f# pipeline


【解决方案1】:

如果您想在管道中执行此操作,我认为您的解决方案无法改进。另一种方法是使用let 绑定,同时拆分流水线操作,以避免出现像mapiter 的爱子一样的函数。

let (det, solution) = SolveEquasion
printfn "Determinant = %f\nSolution = %A" det (Array.toList solution)
//do something else with solution

【讨论】:

    【解决方案2】:

    我认为最初的解决方案很好,我们可以通过为您的匿名函数提供我在其他一些基于流水线高阶函数的库中看到的名称来提高其清晰度:tap .

    let tap f x =
        f x
        x
    
    (1.0, [| 2.0; 3.0 |])
    |> tap (fun (s, a) -> printfn "%A %A" s a)
    |> snd
    

    【讨论】:

      【解决方案3】:

      好吧,一方面,您可以通过返回单个值而不是前一个函数的元组来跳过使用snd

      ...
      |> SolveEquasion
      |> (fun (det, solution) -> 
              printfn "Determinant = %f\nSolution = %A" det (Array.toList solution) 
              solution )
      

      【讨论】:

        【解决方案4】:

        我可能会使用 Daniel 的方法,只需使用 let 将要打印的值分配给符号。或者,您可以定义printf 的变体,它接受一些参数并返回其中一个。我不确定是否有一个通用的方案应该如何做到这一点 - 对于你的例子,它需要一个二元素元组:

        let mprintf fmt (a, b) = 
          Printf.kprintf (fun s -> printf "%s" s; (a, b)) fmt a b
        

        然后你可以写:

        ...  
        |> SolveEquasion  
        |> mprintfn "Determinant = %f\nSolution = %A"
        |> snd |> // ... more stuff with solution
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多