Re: Создание списоков списков
От: deniok Россия  
Дата: 17.11.13 17:23
Оценка: 13 (2)
Здравствуйте, _NN_, Вы писали:

_NN>Подскажите как сделать оптимальнее и возможно правильнее.

_NN>Имеем список ,скажем , строк и функцию принимающую строку и возвращающую список строк.
_NN>На каждый элемент списка получаем список из функции и нужно его обойти и передать хвост дальше.

_NN>Скажем при данных "a", "b" и функции x => [x + "x", y + "y"] получаем все возможные варианты: [ax, bx], [ax, by], [ay, bx], [ay, by]


_NN>Вот код который этот делает. (Прощу прощения за Nemerle )

_NN>Конкретно мне не нравится acc + [h'] , этот имеет линейную сложность.

В Хаскеле есть библиотечная forM :: Monad m => [a] -> (a -> m b) -> m [b], которая ровно это делает
> forM ["a","b"] (\x->[x++"x",x++"y"])
[["ax","bx"],["ax","by"],["ay","bx"],["ay","by"]]

Но ее реализация заточена под хаскельный ленивый рантайм и оптимизатор, в частности реализована через foldr, чтобы быть "хорошим консьюмером". Замечу, что a ++ b в Хаскеле имеет линейную сложность по первому аргументу и константную по второму (реюзает санк, прицепляя второй список как хвост).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.