lomeo: (лямбда)
[personal profile] lomeo
Аналог uniplate, не зацикливающийся на рекурсивных данных. На основе кода [livejournal.com profile] 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 _ <- recUniplate testRose]
[1,2,3]

Ключевые слова: SYB, StableName, unsafePerformIO

Date: 2010-02-08 07:24 am (UTC)
From: [identity profile] kurilka.livejournal.com
500 Internal Server Error
58030 5: database is locked

Date: 2010-02-08 07:26 am (UTC)
From: [identity profile] lomeo.livejournal.com
Нажми на ссылку "отсюда" (http://lomeo.livejournal.com/47444.html?thread=303444#t303444).

Date: 2010-02-08 07:30 am (UTC)
From: [identity profile] kurilka.livejournal.com
Нажал конечно.

Date: 2010-02-08 07:31 am (UTC)
From: [identity profile] kurilka.livejournal.com
да и hpaste.org ожил тоже

Date: 2010-02-08 11:45 am (UTC)
From: [identity profile] nponeccop.livejournal.com
а ваш этот
case cast v of
    Just v0 -> (v0:) `fmap` continue
    Nothing -> continue
это случайно не
Data.Foldable.foldr (\v0 -> fmap (v0:)) continue v
?

Date: 2010-02-08 01:04 pm (UTC)
From: [identity profile] lomeo.livejournal.com
foldr же не generic.

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

allB :: [B]
allB = universeRec complexStructure


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

Date: 2010-02-08 01:27 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
и причем тут это? я не говорил, что universeRec - это Prelude.foldr. Я говорил, что упомянутый мной case из вашего кода можно переопределить через Data.Foldable.foldr для типа Maybe, то есть, я предложил вам сделать маленький рефакторинг.

Date: 2010-02-08 01:36 pm (UTC)
From: [identity profile] lomeo.livejournal.com
Нельзя. A и Б типы никак не связаны. А так как, повторюсь, foldr не generic, то у него типы v0 и v связаны.
\v -> foldr (\v0::a -> fmap (v0:)) continue v :: t a -> f a
\v -> case ... :: t -> [a]

Profile

lomeo: (Default)
Dmitry Antonyuk

December 2015

S M T W T F S
  12345
6789101112
131415 16171819
20212223242526
2728293031  

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 22nd, 2017 04:44 pm
Powered by Dreamwidth Studios