1. Куча / Говнокод #12049

    +122

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    data IdPState a r = IdPEnd r | IdPNeedInput | IdPHaveInput a
    {-# INLINE_STREAM idP #-}
    idP :: (Monad m) => Stream l a a r m r
    idP = Stream next IdPNeedInput where
    	{-# INLINE_INNER next #-}
    	next (IdPEnd r) = Done r
    	next IdPNeedInput = NeedInput IdPHaveInput IdPEnd
    	next (IdPHaveInput a) = HaveOutput IdPNeedInput (return ()) a
    
    {-# INLINE_STREAM pipe #-}
    pipe :: Monad m => Stream l a b r0 m r1 -> Stream Void b c r1 m r2 -> Stream l a c r0 m r2
    pipe (Stream nextL sL) (Stream nextR sR) = Stream next (Right (return (), sL, Right sR)) where
    	{-# INLINE_INNER next #-}
    	next (Left r) = Done r
    	next (Right (final, sL, Right sR)) = case nextR sR of
    		Skip sR' -> Skip (Right (final, sL, Right sR'))
    		HaveOutput sR' c o -> HaveOutput (Right (final, sL, Right sR')) (c >> final) o
    		NeedInput p c -> Skip (Right (final, sL, Left (p, c)))
    		Done r -> PipeM (final >> return (Left r))
    		PipeM ms -> PipeM (liftM (Right . (final, sL,) . Right) ms)
    		Leftover _ i -> absurd i
    	next (Right (final, sL, Left (p, c))) = case nextL sL of
    		Skip sL' -> Skip (Right (final, sL', Left (p, c)))
    		HaveOutput sL' final' o -> Skip (Right (final', sL', Right (p o)))
    		NeedInput pL cL -> NeedInput (Right . (final,, Left (p, c)) . pL) (Right . (final,, Left (p, c)) . cL)
    		Done r -> Skip (Right (return (), sL, Right (c r)))
    		PipeM ms -> PipeM (liftM (Right . (final,, Left (p, c))) ms)
    		Leftover sL' i -> Leftover (Right (final, sL', Left (p, c))) i
    
    {-# INLINE_STREAM purePipe #-}
    purePipe :: (forall m . Monad m => Stream l a b r0 m r1) -> (forall m . Monad m => Stream Void b c r1 m r2) -> (forall m . Monad m => Stream l a c r0 m r2)
    purePipe (Stream nextL sL) (Stream nextR sR) = Stream next (sL, Right sR) where
    	{-# INLINE_INNER next #-}
    	next (sL, Right sR) = case nextR sR of
    		Skip sR' -> Skip (sL, Right sR')
    		HaveOutput sR' _ o -> HaveOutput (sL, Right sR') (return ()) o
    		NeedInput p c -> Skip (sL, Left (p, c))
    		Done r -> Done r
    		PipeM ms -> Skip (sL, Right (runIdentity ms))
    		Leftover _ i -> absurd i
    	next (sL, Left (p, c)) = case nextL sL of
    		Skip sL' -> Skip (sL', Left (p, c))
    		HaveOutput sL' _ o -> Skip (sL', Right (p o))
    		NeedInput pL cL -> NeedInput ((, Left (p, c)) . pL) ((, Left (p, c)) . cL)
    		Done r -> Skip (sL, Right (c r))
    		PipeM ms -> Skip (runIdentity ms, Left (p, c))
    		Leftover sL' i -> Leftover (sL', Left (p, c)) i

    Запостил: qbasic, 03 Ноября 2012

    Комментарии (23) RSS

    • Почему absurd не является стандартной функцией? На мой взгляд, должна поставлятся в наборе первой необходимости, а не с какими-то неизвестными билбиотеками.
      Ответить
    • Выглядит как часть какой-то общной библиотеки для обработки потоков, возможно, часть GHC. Похоже на композицию потоков через канал. Плюсовый код с интенсивным использованием шаблонов выглядит ещё хуже.
      Ответить
    • Тяжело людям живётся без состояния.
      Ответить
      • вот почему у функциональщиков после принятых входных вчерашних голова не болит, они просто выводят все в унитаз
        Ответить
      • > Тяжело людям живётся без состояния.
        Ни яхту не купить, ни виллу на канарах...
        Ответить
      • Оно есть, просто, локализовано среди параметров функций и из захваченных констант выше по коду.
        Ответить
        • Сначала отказались от состояния, затем его через жопу прикрутили.
          Молодцы.
          Ответить
          • >через жопу прикрутили.
            Ты так говоришь, как будто это что-то плохое. Наоборот очень удобно и надежно. Да ты и сам хотел выучить фп же.
            Ответить
            • Роман, я же говорил, что не стоит ему сразу Хасекель показывать. У него уже эффект отмены начался, как поток императивной блювотины прекратился. Надо было что-то мультипарадигменное. Например F#\Scala. Там хотябы поток императивного говна до конца не перекрывают. Просачивается. Так глядишь мягко бы и отвык от него.
              Ответить
              • Раздвоение двуличности?
                Ответить
              • Учиться надо контрастами. Как в недавней статье по touch typing из блога Steve Yegge, ссылку на которую тут оставляли: сначала быстро, потом медленно, потом правильно (императивщина -> суровая функциональщина -> правильный гибрид).
                Ответить
            • > Да ты и сам хотел выучить фп же.

              Учу Haskell, хороший язык. А по-поводу монад шуткую.
              Ответить
          • В императивном языке состояние дикое и необузданное. А здесь его упихали в переменную, и не дают ему творить непотребства.
            Ответить
            • >В императивном языке состояние дикое и необузданное.
              Прямо как необъезженый дикий мустанг из прерий. Зато насколько он горд и силён! А в ФП ему надели уздечку и всегда сверху.
              Ответить
            • > А здесь его упихали в переменную

              Переменные? В моём Хаскелле?
              Ответить
    • похоже на самопальный conduit: http://hackage.haskell.org/packages/archive/conduit/0.5.2.7/doc/html/Data-Conduit-Internal.html
      Ответить

    Добавить комментарий