firstライブラリでの実装がわかりません。
firstで再帰的に定義されているようです***-- いつ再帰が終了するかわかりません!?
first :: a b c -> a (b,d) (c,d)
first = (*** id)
と
(***) :: a b c -> a b' c' -> a (b,b') (c,c')
f *** g = first f >>> arr swap >>> first g >>> arr swap
where swap ~(x,y) = (y,x)
first fは(f *** id)どれで(first f >>> arr swap >>> first id...)、新しいものfirstは別のものになる(*** id)など...