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

    +116

    1. 1
    append x = foldr (map (:) x) id

    Запостил: HaskellGovno, 20 Мая 2012

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

    • Я пишу программы на Хаскеле, а затем ем мамин борщ. Потом опять пишу программы на Хаскеле и снова ем мамин борщ.
      Ответить
      • Тяжела и неказиста жизнь простого хаскелиста.
        Ответить
        • А кто-нибудь слышал о не простых Хаскелистах?
          Ответить
          • Ну вот ты, например, Хаскеллист и при этом школьник, чем не непростой.
            Ответить
            • [вброс]http://it-talk.org/post77404.html[/вброс]
              Ответить
              • Блин, самому захотелось побаловаться с Gloss.
                Вспомнилась глава про изображения из SICP
                http://tinyurl.com/sicp-img
                Ответить
              • http://ememdem.net/uploads/images/00/00/18/2012/02/17/fc9e8f.jpg
                Ответить
      • А можно хоть на одну программу посмотреть?
        Ответить
        • Ишь ты какой пострел...
          Код украсть захотел...
          Ответить
          • Раскусил, но ничего, сейчас соберу твои сниппеты вместе - и получу полезное приложение, не имеющее аналогов.

            И буду загребать бабло!!1
            Ответить
          • Да вы, батенька, еще и проприетарщик.
            Ответить
          • (рискну не прослыть луркоебом) копираст!!!
            Ответить
    • (:) :: a -> [a] -> [a]
      map :: (a -> b) -> [a] -> [b]
      foldr :: (a -> b -> b) -> b -> [a] -> b
      
      append x = foldr (map (:) x) id

      Как в функцию map, принимающую один аргумент, передают функцию (:) принимающую 2 аргумента?
      Ответить
      • Троллешь штоле? Частичное применение же
        (:) x :: [a] -> [a]
        Ответить
        • map (:) x имеет тип [[a]->[a]], так?
          Тогда как это может быть первым аргумертом foldr?
          Ответить
          • А оно и не компилится:
            Prelude> let badAppend x = foldr (map (:) x) id
            
            <interactive>:1:26:
                Couldn't match expected type `a0 -> b0 -> b0'
                            with actual type `[b1]'
                In the return type of a call of `map'
                In the first argument of `foldr', namely `(map (:) x)'
                In the expression: foldr (map (:) x) id
            Ответить
            • > А оно и не компилится:
              Он считает, что компилируется:
              http://ru-lambda.livejournal.com/10085.html
              Ответить
              • Он в комментах признал, что накосячил
                Там же написан более приятный вариант
                append = flip $ foldr (:)
                Ответить
                • >Он в комментах признал, что накосячил
                  >Там же написан более приятный вариант
                  >append = flip $ foldr (:)
                  Ты что не видиш, что это совсем другое. Этот вариант не один элемент x присобачивает, а много append [1..5] [2..5]
                  http://ideone.com/9QiLS
                  Ответить
                  • Так в начале он вроде и собирался списки конкатенировать, не?
                    Ответить
                  • > что это совсем другое
                    ну адаптируй, flip теперь не нужен (первый аргумент в конец): foldr (:) . (:[])
                    Ответить
        • > Троллешь штоле? Частичное применение же
          > (:) x
          Больше похоже, что x вторым параметром для map передаётся. А частичное применение делается так: (:x)
          Ответить
          • да, это я с утра косячу, не спал полночи
            На самом деле благодаря каррированию все функции в хаскеле - функции одного аргумента. (:) - функция одного аргумента, возвращающая при частичном применении другую функцию. Поэтому x должен быть списком. В результате (map (:) x) будет порождать список функций, принимающих на вход список, и возвращающих список, что и отражено в типе [[a]->[a]]. Эти функции будут приклеивать разные элементы из x.
            Ответить
            • Вот оно что. А слона то я и не приметил... Спасибо... :)
              Ответить
            • >В результате (map (:) x) будет порождать список функций, принимающих на вход список, и возвращающих список, что и отражено в типе [[a]->[a]]. Эти функции будут приклеивать разные элементы из x.

              А вот такая генерация списка функций - это на времени компиляции и на производительности кода не сказывается?
              Ответить
              • Ну, чтобы было с чем сравнивать, в ООП языках довольно часто нужно генерировать список действий (представленных в виде экземпляра некоторого класса) с параметрами (например, пункты меню составляем). Собственно, задача изоморфная. На мой взгляд, не подкреплённый практическими подсчётами, на скорости компиляции это сказаться особо не должно, вариант с частичным применением в haskell должен работать чуть шустрее. Ленивая инициализация, опять же. Но точных данных у меня нет.
                Ответить
                • Забавно, по поводу меню вспомнилось:
                  http://fmapfixreturn.wordpress.com/2008/07/09/comonads-in-everyday-life/

                  Поднимают (и решают) такую проблему:
                  "So anyway, you’re describing the structure of your website twice, in perhaps very different formats"
                  Ответить

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