F# 正在进行的打印fn

F# 正在进行的打印fn,f#,pipeline,F#,Pipeline,所以我有一个函数solveQuasion,它返回一对float*float[]。打印数字和阵列并继续使用阵列的最佳方式是什么?我编写了以下代码,但似乎有更好的方法 如果你想在管道中实现这一点,我认为你的解决方案无法改进。另一种方法是使用let绑定以及拆分流水线操作,以避免使用类似于map和iter的爱子函数 let (det, solution) = SolveEquasion printfn "Determinant = %f\nSolution = %A" det (Array.toList

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


如果你想在管道中实现这一点,我认为你的解决方案无法改进。另一种方法是使用
let
绑定以及拆分流水线操作,以避免使用类似于
map
iter
的爱子函数

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

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

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

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

我认为最初的解决方案很好,我们可以通过给匿名函数起一个名字来提高它的清晰度,这个名字我在其他一些基于管道化高阶函数的库中见过:tap

当你说“继续使用数组”时,你的意思是通过管道将它连接到其他函数吗?
...  
|> SolveEquasion  
|> mprintfn "Determinant = %f\nSolution = %A"
|> snd |> // ... more stuff with solution
let tap f x =
    f x
    x

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