Подскажите как сделать оптимальнее и возможно правильнее.
Имеем список ,скажем , строк и функцию принимающую строку и возвращающую список строк.
На каждый элемент списка получаем список из функции и нужно его обойти и передать хвост дальше.
Скажем при данных "a", "b" и функции x => [x + "x", y + "y"] получаем все возможные варианты: [ax, bx], [ax, by], [ay, bx], [ay, by]
Вот код который этот делает. (Прощу прощения за Nemerle
)
Конкретно мне не нравится acc + [h'] , этот имеет линейную сложность.
using Nemerle.Collections;
using System.Console;
module Program
{
F(l : list[string], f : string -> list[string]) : list[list[string]]
{
def impl(l, acc)
{
match(l)
{
| [] => [acc]
| h :: t => f(h).Map(h' => impl(t, acc + [h'])).Flatten()
}
}
impl(l, [])
}
Main() : void
{
def res = F(["a", "b"], x => [x + "x", x + "y"]);
// ax, bx
// ax, by
// ay, bx
// ay, by
foreach(r in res)
WriteLine($"..$r");
_ = ReadLine();
}
}
Map = Haskell map
Flatten = Haskell concat