Ответы пользователя по тегу Erlang
  • Как подлючить к erlang проекту iconv?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Вообще как лучше работать из erlang с разными кодировками? Нужно из utf-8 получить windows1251.

    unicode:characters_to_binary(Data, InEncoding, OutEncoding) -> Result
    Ответ написан
    1 комментарий
  • Какой функциональный язык переспективнее: Erlang или Scala?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Так с чего начать: Scala или Erlang(Elixir?)?

    Только вам решать. На мой взгляд лучше выучить оба и добавить ещё Clojure и Haskell. А потом уже выбирать.

    Что перспективнее у нас/за рубежом?

    Просмотрите вакансии. Сравните по количеству предложений и размерам зарплат.

    И можно их учить без знания Java?

    Можно.
    Ответ написан
    Комментировать
  • Какие книги почитать по функциональному программированию?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Функциональное программирование
    Седой и строгий
    Восприятие языка - это вопрос индивидуальный. То, что далось легко мне, может показаться сложным вам. И наоборот. Но личным опытом поделиться могу:

    У Haskell есть веское, на мой взгляд, преимущество - программы компилируются в бинарники. А минус в том, что я никогда не слышал о сколько-нибудь значимых случаях реального применения Haskell. Для восприятия он мне показался очень тяжёлым, литературу по нему можно использовать как снотворное.

    Самой простой для изучения мне показалась Scala. Мультипарадигменность языка обеспечивает более лёгкое вхождение из императивного стиля программирования. Есть замечательный учебник "Scala для нетерпеливых" Кея Хорстманна. К тому же, вакансии на scala-программистов есть даже в РФ. Минусом для меня послужила как раз мультипарадигменность. Нет вызова, нет настоящей мозголомки, способствующей перекраиванию мышления.

    Erlang интересный, чисто функциональный, широко применяются. Но чувствуется некоторая незаконченность языка и отовсюду выпирает телекоммуникационное наследие. Есть неплохой учебник на русском Чезарини и Томпсона "Программирование в Erlang". Плюс, сейчас появился Elixir. Слышал, что он хорош и, что в нём решили все проблемы Erlang, но сам не щупал.

    Я в результате остановился на Clojure. Кложа сложная, но она реально учит думать по-новому. По ней много книг. В том числе есть на русском - "Программирование на Clojure" Эмерика. Хорошая документация, большое и дружелюбное сообщество. В реальном мире применяется чаще, чем Haskell, но реже Scala или Erlang.
    Ответ написан
    6 комментариев
  • Как конвертировать xml в csv в функциональном стиле?

    sergey-gornostaev
    @sergey-gornostaev Автор вопроса, куратор тега Clojure
    Седой и строгий
    xandox хотелось примерно такого
    (ns su.gornostaev.rstatfr2csv
      (:use [clojure.xml :only (parse)])
      (:use [clojure.string :only [index-of join split]])
      (:use [clojure.java.io])
      (:import java.io.File))
    
    (defn parse-cmd
      [args]
      (when-let [file-name (first args)]
        file-name))
    
    (defn parse-file
      [file-name]
      (if (nil? file-name) nil (parse (File. file-name))))
    
    (defn format-datetime
      [dt]
      (let [[date time] (split dt #"\s")]
        (str (join "." (reverse (split date #"\."))) " " (subs time 0 (index-of time \:)) ":00")))
    
    (defn merge-counters
      [counters]
      (map
        (fn [item]
          (let [[k & v] item]
          (assoc (reduce (fn [acc val] (merge-with + acc val)) (first v)) :dt k)))
        (reduce
          (fn [acc val] 
            (let [{:keys [dt in out]} val]
            (update-in acc [dt] (fnil #(conj % {:in in :out out}) []))))
          {} counters)))
    
    (defn parse-counters
      [sensor]
      (map
        (fn [counter]
          {:dt (format-datetime (:datetime (:attrs counter))) 
           :in (read-string (:realin (:attrs counter))) 
           :out (read-string (:realout (:attrs counter)))})
        sensor))
    
    (defn parse-sensors
      [shop]
      (map
        (fn [sensor]
          {:name (:name (:attrs sensor)) :counters (merge-counters (parse-counters (:content sensor)))})
        shop))
    
    (defn parse-shops
      [dom]
      (map
        (fn [shop]
          {:name (:name (:attrs shop)) :sensors (seq (parse-sensors (:content shop)))})
        dom))
    
    (defn parse-doc
      [doc]
      (parse-shops
        (->> 
          doc
          :content
          first
          :content)))
    
    (defn save-csv
      [data]
      (with-open [w (writer (file "output.csv"))]
        (doseq [shop data]
          (doseq [sensor (:sensors shop)]
            (doseq [counter (:counters sensor)]
              (.write w (str (join "\t" (concat [(:name shop) (:name sensor)] (vals (into (sorted-map) counter)))) "\n")))))))
    
    (save-csv (parse-doc (parse-file (parse-cmd *command-line-args*))))
    Ответ написан
    Комментировать