Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I get the intermediate results from each step of a multi-step pipeline function?

Tags:

f#

pipeline

I have a code which looks like this:

this.GetItemTypeIdsAsListForOneItemTypeIdTreeUpIncludeItemType itemType.AutoincrementedId
|> Array.map (fun i -> i.AutoincrementedId)
|> Array.map (BusinessLogic.EntityTypes.getFullSetOfEntityTypeFieldValuesForItemTypeAid item.Autoincrementedid)
|> Array.fold Array.append [||]
|> Array.map (fun fv -> { fv with ReferenceAutoId = aid } )
|> Array.toSeq
|> Seq.distinctBy (fun fv -> fv.Fieldname)
|> Seq.toArray

Sometimes such code gets the unusual result which I need to explain. Usually there is not error in the code. There is an error in the data. And I need to explain why this backet of data is incorrect. What is the best way to do it ?

I just want to look at the list on each step of this expression.

Something like:

func data
|> func2 && Console.WriteLine
|> func3 && Console.WriteLine
....

Get input, split it on two. Pass one of the output to the next function, and second output to Console.

like image 855
ceth Avatar asked Dec 24 '22 07:12

ceth


1 Answers

For a quick and dirty solution, you can always add a function like this one:

// ('a -> unit) -> 'a -> 'a
let tee f x = f x; x

If, for example, you have a composition like this:

[1..10]
|> List.map string
|> String.concat "|"

you can insert tee in order to achieve a side-effect:

[1..10]
|> List.map string
|> tee (printfn "%A")
|> String.concat "|"

That's not functional, but can be used in a pinch if you just need to look at some intermediate values; e.g. for troubleshooting.

Otherwise, for a 'proper' functional solution, perhaps application of the State monad might be appropriate. That will enable you to carry around state while performing the computation. The state could, for example, contain custom messages collected along the way...

If you just want to 'exit' as soon as you discover that something is wrong, though, then the Either monad is the appropriate way to go.

like image 122
Mark Seemann Avatar answered Jan 30 '23 00:01

Mark Seemann