Огромная проблема заключается в сопоставлении вашего шаблона:
sepConcat sep [] = ""
sepConcat sep (x:xs) = foldLeft f base l
Вам не нужно снова делить шаблоны на []
и (x:xs)
, потому что foldl и foldr позаботьтесь о обоих случаях . Вот как можно определить foldl
для списка с рекурсией:
foldLeft :: (b -> a -> b) -> b -> [a] -> b
foldLeft f base [] = base
foldLeft f base (x:xs) = f (foldLeft f base xs) x
вам просто нужно правильно применить оба случая:
sepConcat :: String -> [String] -> String
sepConcat sep xs = foldLeft (\rs s ->
if null rs
then s ++ rs
else s ++ sep ++ rs) "" xs
Здесь случай пустого списка: ""
и функция для рекурсивного случая списка
с вашим примером:
sepConcat ", " ["foo", "bar", "baz"]
=> "foo, bar, baz"