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)
など...