Куча говна / Говнокод #12049 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 qbasic, (Updated )

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

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

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

            Переменные? В моём Хаскелле?
            Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8