@@ -38,10 +38,16 @@ pack [] = ""
3838pack (x :: xs) = strCons x (pack xs)
3939
4040instance Cast String (List Char) where
41− cast = unpack
41+ cast = unpack
4242
4343instance Cast (List Char) String where
44− cast = pack
44+ cast = pack
45+
46+instance Semigroup String where
47+ (<+>) = (++)
48+
49+instance Monoid String where
50+ neutral = ""
4551
4652span : (Char -> Bool) -> String -> (String, String)
4753span p xs with (strM xs)
@@ -85,18 +91,18 @@ lines : String -> List String
8591lines s = map pack $ words' $ unpack s
8692
8793partial
88−foldr1 : (a -> a -> a) -> List a -> a
94+foldr1 : (a -> a -> a) -> List a -> a
8995foldr1 f [x] = x
9096foldr1 f (x::xs) = f x (foldr1 f xs)
9197
9298%assert_total -- due to foldr1, but used safely
9399unwords' : List (List Char) -> List Char
94−unwords' [] = []
100+unwords' [] = []
95101unwords' ws = (foldr1 addSpace ws)
96102 where
97103 addSpace : List Char -> List Char -> List Char
98− addSpace w s = w ++ (' ' :: s)
99−
104+ addSpace w s = w ++ (' ' :: s)
105+
100106unwords : List String -> String
101107unwords = pack . unwords' . map unpack
102108