Обновление: Понятно, я не был достаточно явным.
Haskell имеет функцию перестановок , которая поможет:
import Data.List
permutations ["hel","lo","bye"] ==
[["hel","lo","bye"],["lo","hel","bye"],["bye","lo","hel"],
["lo","bye","hel"],["bye","hel","lo"],["hel","bye","lo"]]
Если вы хотите объединить каждую перестановку, используйте
map concat (permutations ["hel","lo","bye"]) ==
["hellobye","lohelbye","byelohel","lobyehel","byehello","helbyelo"]
Если вы действительно хотите комбинаций двух подстрок (как в примере с вашим примером) вместо всех перестановок подстрок, как заметил @Sven, используйте модуль Math.Combinatorics.Graph :
map concat (combinationsOf 2 ["hel","lo","bye"])
Это соответствует вашим примерным данным в некоторых отношениях, но не в других. Я мог бы продолжить рассуждать о том, что вам нужны «все возможные строки», как говорится в заголовке, или все перестановки подмножеств с двумя токенами, или что у вас есть, но рассуждать бессмысленно, поскольку вы уже приняли ответ.