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

    +129

    1. 1
    arr <- return $ map (2*) lst

    Я тут читал раздел на одном форуме по решению задач для школьников и наткнулся на такое говно.
    - let?
    - Не, не слышал.
    Подозреваю, что автор не понял, что let нужно писать без in в монадах, чтобы скомпилировалось.

    Запостил: HaskellGovno, 17 Октября 2012

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

    • Кстати, бывают хоть какие-нибудь причины применять <- return взамен let в монадах на реальных задачах? Может например чтобы организовать какое-нибудь особое поведение?
      Ответить
      • Так поведение подобного кода, имхо, ничем не отличается от let в do блоках... Скорее всего оба сахарка компилируются в один и тот же код.
        Ответить
        • > оба сахарка
          В хаскеле let разве сахарок?
          Ответить
        • Эквивалентность этих выражений - первый монадический закон (Left Identity):
          -- http://www.haskell.org/haskellwiki/Monad_Laws
          
          return a >>= f  ≡  f a
          Ответить
    • В Хаскеле совсем нет свободного частичного применения? Может расширение компилятора какое включить?
      Чтобы можно было как в Scala или Nemerle использовать какой-нибудь символ, например _ , чтобы им указывать свободные параметры (фактически частичное применение параметров в произвольном порядке), например:
      ml = map _ list1
      Теперь функция ml принимает функцию для мапинга, а список принимать ей уже не нужно.
      Знаю про частичное применение бинарных функций, но это немного не то.
      Ответить
    • И ещё, ребят, у меня серьёзная проблема. Я для себя решил по писать ХелоВорды банковские динамические опердени на Хаскеле. Но не суть.
      У меня получилось несколько модулей и несколько потоков. Как завести глобальную переменную/переменные, видимую в нескольких модулях, чтобы можно было общаться между ними из грязных функций? Какие вообще средства для этого есть? Что из них посоветуете? Я сейчас просто остановился. Даже не знаю что с этим делать... В каком-нибудь другом языке я бы уже нашел решение, но тут так всё непривычно...
      Ответить
      • Проблема в том, что все глобальные "переменные" чисты. И засунуть туда тот же MVar не удастся. Поэтому остается только один вариант - создавать глобальный контекст в главном модуле, набивать в него, к примеру, MVar'ы или IORef'ы (чтобы можно было что-то в нем менять) и передавать его тем модулям, которым нужен доступ к глобальному состоянию.

        P.S. Может быть Роман предложит что-нибудь более красивое.
        Ответить
        • Моё видение такое: треды-воркеры должны принимать объекты каналов и переменных и прятать в замыканиях, а конфигурацией должна заниматься функция - координатор, запускающая треды на выполнение. Т.е. почти тоже самое. Глобальный контекст тоже можно, например, ReaderT прикрутить...
          Ответить

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