myfoldr :: [a] -> b -> (a -> b -> b) -> b
myfoldr [] base _ = base
myfoldr (x:xs) base f = f x (myfoldr xs base f)
myfoldl :: [a] -> b -> (a -> b -> b) -> b
myfoldl [] base _ = base
myfoldl (x:xs) base f = myfoldl xs (f x base) f
mymap :: [a] -> (a -> b) -> [b]
mymap xs f = myfoldr xs [] (\x -> \y -> (f x) : y)
myfilter :: [a] -> (a -> Bool) -> [a]
myfilter xs f = myfoldr xs [] (\x -> \y -> if f x then x:y else y)
mysplit :: [a] -> Int -> a -> [a]
mysplit xs n s = myfoldr xs [] (\x -> \y -> if (length y >= n) && (length y + 1) `mod` (n + 1) == 0 then x : s : y else x : y)
myperm :: (Eq a) => [a] -> [[a]]
myperm [x] = [[x]]
myperm xs = myfoldr xs [] (\x -> \xss -> (mymap (myperm $ myfilter xs (\m -> m /= x)) (\p -> x:p)) ++ xss)
main =
do
print $ myfoldl [1,2,3,4] [] (\x -> \y -> x : y)
print $ mymap [1,2,3,4] (\x -> x * x)
print $ myfilter [1,2,3,4] (\x -> x < 3)
print $ mysplit [1..17] 2 100
print $ myperm ['a','b','c']