Uniplate для рекурсивных данных

Feb 08, 2010 10:16

Аналог uniplate, не зацикливающийся на рекурсивных данных. На основе кода permea_kra (спасибо!).

Код на hpaste ( отсюда)

Пример использования

data Rose = Rose { roseId :: Int, roses :: [Rose] }
deriving (Data,Typeable)

testRose = let
a = Rose 1 [b,c]
b = Rose 2 [a,c]
c = Rose 3 [a,b]
in a

Работаем...

> [id | Rose id _ <- ( Read more... )

haskell, рекурсия, fp, программирование

Leave a comment

Comments 8

kurilka February 8 2010, 07:24:22 UTC
500 Internal Server Error
58030 5: database is locked

Reply

lomeo February 8 2010, 07:26:40 UTC
Нажми на ссылку "отсюда".

Reply

kurilka February 8 2010, 07:30:31 UTC
Нажал конечно.

Reply

kurilka February 8 2010, 07:31:01 UTC
да и hpaste.org ожил тоже

Reply


nponeccop February 8 2010, 11:45:38 UTC
а ваш этот
case cast v of
Just v0 -> (v0:) `fmap` continue
Nothing -> continueэто случайно не
Data.Foldable.foldr (\v0 -> fmap (v0:)) continue v?

Reply

lomeo February 8 2010, 13:04:10 UTC
foldr же не generic.

Задача - есть направленный циклический граф, узлы которого могут быть разного типа. Нужно, начиная с определённого узла (типа А) вытащить все узлы типа Б, до которых можно дойти из начального узла. Нужно, чтобы в выборке узлы не повторялись.

complexStructure :: A

allB :: [B]
allB = universeRec complexStructure

Такое foldr не позволяет.

Reply

nponeccop February 8 2010, 13:27:12 UTC
и причем тут это? я не говорил, что universeRec - это Prelude.foldr. Я говорил, что упомянутый мной case из вашего кода можно переопределить через Data.Foldable.foldr для типа Maybe, то есть, я предложил вам сделать маленький рефакторинг.

Reply

lomeo February 8 2010, 13:36:15 UTC
Нельзя. A и Б типы никак не связаны. А так как, повторюсь, foldr не generic, то у него типы v0 и v связаны.

\v -> foldr (\v0::a -> fmap (v0:)) continue v :: t a -> f a
\v -> case ... :: t -> [a]

Reply


Leave a comment

Up