printfn в конвейере - PullRequest
       18

printfn в конвейере

3 голосов
/ 02 марта 2011

Итак, у меня есть функция SolveEquasion, которая возвращает пару с плавающей точкой * float []. Каков наилучший способ напечатать число и массив и продолжить работу с массивом? Я сделал следующий код, но, кажется, есть лучший способ

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

Ответы [ 4 ]

3 голосов
/ 03 марта 2011

Я не думаю, что ваше решение может быть улучшено, если вы хотите сделать это в конвейере. Другой подход заключается в использовании привязки let вместе с разбиением конвейерных операций, чтобы избежать использования функции, которая действует как дочерний объект любви map и iter.

.
let (det, solution) = SolveEquasion
printfn "Determinant = %f\nSolution = %A" det (Array.toList solution)
//do something else with solution
2 голосов
/ 03 марта 2011

Я думаю, что оригинальное решение в порядке, и мы можем улучшить его ясность, дав вашей анонимной функции имя, которое я видел в некоторых других библиотеках, основанных на конвейерной передаче функций высшего порядка: tap .

let tap f x =
    f x
    x

(1.0, [| 2.0; 3.0 |])
|> tap (fun (s, a) -> printfn "%A %A" s a)
|> snd
1 голос
/ 03 марта 2011

Ну, во-первых, вы можете пропустить использование snd, возвращая одно значение, а не кортеж из предыдущей функции:

...
|> SolveEquasion
|> (fun (det, solution) -> 
        printfn "Determinant = %f\nSolution = %A" det (Array.toList solution) 
        solution )
0 голосов
/ 03 марта 2011

Я бы, вероятно, использовал подход Даниэля и просто присвоил бы значение, которое вы хотите напечатать символу, используя 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
...