join _ [] = [] -- this means that join on the empty list is the empty string join delim strings = foldl1 (\left right -> left ++ delim ++ right ) strings -- this is join implemented with reduce -- also this could be written as join delim strings = foldl1 ((++) . (++ delim)) strings -- or more perlishly join delim strings = foldl1 (\left right -> concat [left, delim, right]) strings -- or with autocurrying fun join = foldl1 . ((++) .) . flip (++) #### sub join { my ( $delim, @strings ) = @_; reduce { $a . $delim . $b } @strings; } but in this case the concatenation operator is not used directly as the a curried higher order function