printfn正在进行中

时间:2011-03-02 20:59:41

标签: f# pipeline

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

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

4 个答案:

答案 0 :(得分:3)

如果您想在管道中执行此操作,我认为您的解决方案无法改进。另一种方法是使用let绑定,以及拆分流水线操作,以避免使用类似于mapiter的爱孩子的功能。

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

答案 1 :(得分: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

答案 2 :(得分:1)

嗯,首先,您可以通过返回单个值而不是前一个函数中的元组来跳过snd的使用:

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

答案 3 :(得分:0)

我可能会使用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