------------------------asLines: realisiert mit foldr und foldl

copy:: Int->a->[a]                --Liste mit n-mal elem                    
copy (n+1) elem = elem : copy n elem
copy _ _ = []

break1:: Char->[[Char]]->[[Char]]
break1 c ls
   |c == '\n' = [[]] ++ ls                     --new group
   |otherwise = [[c]++(head ls)] ++ (tail ls)  --add to group

asLines1:: [Char]->[[Char]]
asLines1  = foldr break1 [[]]


break2:: [[Char]]->Char->[[Char]]
break2 ls c
   |c == '\n' = ls ++ [[]]                     --new group
   |otherwise = (init ls) ++ [(last ls)++[c]]  --add to group

asLines2:: [Char]->[[Char]]
asLines2  = foldl break2 [[]]

{-----------------------------Beispielanwendungen asLines1/2:

Main> length (asLines1 (copy 1000 'a')) 
1
(15023 reductions, 32026 cells)
Main> length (asLines2 (copy 1000 '\a'))
1
(14023 reductions, 30026 cells, 1 garbage collection)

Main> length (asLines1 (copy 1000 '\n'))
1001
(19024 reductions, 32033 cells)
Main> length (asLines2 (copy 1000 '\n'))
1001
(518524 reductions, 1531533 cells, 17 garbage collections)

-----------------------------------------------------------}




{-------------------------------------------fold with strict op
Main> foldr (+) 0 [1..1000]
500500
(13020 reductions, 17032 cells)
Main> foldl (+) 0 [1..1000]
500500
(13020 reductions, 18032 cells)

----------------------------------------fold with non-strict op

Main> foldr (&&) True [False,True,True,True,True,True,True,True,True,True]
False
(15 reductions, 31 cells)
Main> foldr (&&) True [True,True,True,True,True,False,True,True,True,True]
False
(25 reductions, 41 cells)
Main> foldr (&&) True [True,True,True,True,True,True,True,True,True,False]
False
(33 reductions, 49 cells)

Main> foldl (&&) True [False,True,True,True,True,True,True,True,True,True]
False
(34 reductions, 59 cells)
Main> foldl (&&) True [True,True,True,True,True,False,True,True,True,True]
False
(34 reductions, 59 cells)
Main> foldl (&&) True [True,True,True,True,True,True,True,True,True,False]
False
(34 reductions, 59 cells)

--------------------------------------------------------------}

---------------------------einfacheres foldr/foldl (++) Beispiel

right, left:: Int->Int
right m = length (foldr (++) [] (copy m "0123456789"))
left m  = length (foldl (++) [] (copy m "0123456789"))

{--------------------------------------Beispielanwendungen

Main> right 1
10
(90 reductions, 145 cells)
Main> right 10
100
(729 reductions, 1118 cells)
Main> right 100
1000
(7119 reductions, 10839 cells)
Main> right 1000
10000
(71019 reductions, 108040 cells, 2 garbage collections)

Main> left 1
10
(80 reductions, 116 cells)
Main> left 10
100
(1079 reductions, 2178 cells)
Main> left 100
1000
(55619 reductions, 156439 cells, 1 garbage collection)
Main> left 1000
10000
(5056019 reductions, 15064040 cells, 163 garbage collections)

-------------------------------------------------------------}






------------------------------------------------Konkatenation
concTwo:: Int->Int
concTwo m = length ((copy m 'a') ++ "0123456789")

{------------------------------------------------Anwendungen:

Main> concTwo 1
11
(84 reductions, 121 cells)
Main> concTwo 10
20
(219 reductions, 346 cells)
Main> concTwo 100
110
(1569 reductions, 2597 cells)
Main> concTwo 1000
1010
(15069 reductions, 25098 cells, 1 garbage collection)
Main> concTwo 10000
10010
(150069 reductions, 250099 cells, 2 garbage collections)

------------------------------------------------------------}
