@delta answer , . x ys = [y1,y2,...,yn], , , x : ys.
. [y1,x,y2,...,yn]. y1 : x : y2s. y1 : ....
: , , . : id. id (x:ys), , , (x:ys).
, id, id2 = \z -> id (y1:z). , , y1 , , id2 . id3 = \z -> id2 (y2:z). y1 y2 , z.
, :
insert' :: a -> [a] -> [[a]]
insert' x = go id
where go d [] = [d [x]]
go d ys@(yh:yt) = (d (x : ys)) : go (d . (yh :)) yt
, insert' go, - id. , . , basecase: [x] ( ) , , , x .
, d (x : ys): x d. d y1 : y2 : ... : yk , x. , go (d . (yh :)) yt : , (yh :) . , : yh.
:
*Main> insert' 4 []
[[4]]
*Main> insert' 4 [1,2,5]
[[4,1,2,5],[1,4,2,5],[1,2,4,5],[1,2,5,4]]
*Main> insert' 7 [1,2,3]
[[7,1,2,3],[1,7,2,3],[1,2,7,3],[1,2,3,7]]