Arrow<'T, 'U> represents a process that takes as input something of type 'T and outputs something of type 'U.
arr f and first fstatic member Arr(f: 'T -> 'U) : 'Arrow<'T, 'U>
static member First (f: 'Arrow<'T, 'U>) : 'Arrow<('T * 'V),('U * 'V)>
second fstatic member Second (f: 'Arrow<'T, 'U>) : 'Arrow<('V * 'T),('V * 'U)>
(***) f gstatic member ``***`` (f : 'Arrow<'T1,'U1>) (g : 'Arrow<'T2,'U2>) : 'Arrow<('T1 * 'T2),('U1 * 'U2)>
(&&&) f gstatic member (&&&) (f : 'Arrow<'T,'U1>) (g : 'Arrow<'T,'U2>) : 'Arrow<'T,('U1 * 'U2)>
arr id = id
arr (f >>> g) = arr f >>> arr g
first (arr f) = arr (first f)
first (f >>> g) = first f >>> first g
first f >>> arr fst = arr fst >>> f
first f >>> arr (id *** g) = arr (id *** g) >>> first f
first (first f) >>> arr assoc = arr assoc >>> first f
where assoc ((a,b),c) = (a,(b,c))
From .Net/F#
'T->'UFunc<'T,'U>From F#+
Suggest another concrete implementation