所以我有一个函数SolveEquasion返回一对float * float []。打印数字和数组并继续使用数组的最佳方法是什么?我做了以下代码,但似乎有更好的方法
... |> SolveEquasion |> (fun (det, solution) -> printfn "Determinant = %f\nSolution = %A" det (Array.toList solution), solution ) |> snd
答案 0 :(得分:3)
如果您想在管道中执行此操作,我认为您的解决方案无法改进。另一种方法是使用let
绑定,以及拆分流水线操作,以避免使用类似于map
和iter
的爱孩子的功能。
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