Шлюхи без блекджека, блекджек без шлюх. Войти !bnw Сегодня Клубы
Привет, TbI — HRWKA! 1239.0 пользователей не могут ошибаться!
?6941
прекрасное6443
говно5904
говнорашка5512
хуита4710
anime3065
linux2651
music2633
bnw2601
рашка2565
log2354
ололо2166
дунч1821
pic1815
сталирасты1491
украина1439
быдло1437
bnw_ppl1417
дыбр1238
гімно1158

Победил HXT, вынув из XML'ек условия задач для рассчётки. Всё ещё не понимаю, как может стрелка иметь тип ArrowXml a => a XmlTree XmlTree и при этом возвращать не одно значние, а несколько. Не понимаю, как это всё разветвляется и сливается обратно без необходимости делать map и concat. Аргх.

--Minoru, который думал, что он понял стрелки

#N9BR4J (4+1) / @minoru / 4023 дня назад

Драйвер редиса возвращает Redis (Either Reply a). При операции HGET возвращает, соответственно, Redis (Either Reply (Maybe ByteString)), типа значения по ключу может и не быть. Программист для упрощения пишет сначала специальную функцию redis', которая заворачивает ответ редиса в EitherT-based монаду, чтоб соединять подобные вычисления и возвращать первую неудачу:

newtype Redis' a = Redis' (EitherT Redis.Reply Redis.Redis a) deriving (MonadIO)
instance Monad Redis' where
    return = Redis' . EitherT . return . Right
    (Redis' m) >>= f = Redis' $ m >>= \rv -> unwrapRedis' $ f rv
redis' = Redis' . EitherT

Таким образом, теперь, если вы получаете ответ Redis (Either Reply a), вы его преобразуете в

Redis' (EitherT Reply Redis a)

и можете соединять подобные вычисления в do-блоке типа:

do
    res <- redis' $ Redis.hget foo bar
    res2 <- redis' $ Redis.hget baz zab

и вычисление остановится на первом возврате ошибки.

Далее. Программисту необходимо по кучке значений сделать HGET и вернуть это как-то внутри кортежа, поскольку мы внутри новой монады Redis' -- завернуть результат в неё. В случае, если значения хоть по одному ключу не существует, хочется вернуть Nothing для всех. Потому создаётся новая монада:

newtype HashFields a = HashFields (MaybeT Redis' a)
    deriving (Functor, Monad)
instance Applicative HashFields where
    pure = return
    (<*>) = ap

описывающая вычисления типа Redis', которые могут вернуть неудачу. Пишется новая функция

hashField = HashFields . MaybeT . redis'

способная завернуть результат неудачи в новую монаду, которая умеет останавливаться на первой неудаче. Также пишется специальная функция для HGET:

getField :: ByteString -- ^ Key
         -> ByteString -- ^ Hash field name
         -> HashFields String
getField key field = fmap toString $ hashField $ Redis.hget key field

Также напишем функцию, которая "запустит" наше вычисление:

getRedisFields :: forall a. HashFields a -> Redis' (Maybe a)
getRedisFields (HashFields f) = runMaybeT f

И теперь лёгким движением руки мы можем сделать что-то вроде:

getRedisFields ((,,,,,) <$>
    getField k "foo" <*>
    getField k "bar" <*>
    getField k "baz" <*>
    getField k "zab" <*>
    getField k "rab" <*>
    getField k "oof")

Вопрос: вам не кажется это "слишком"? Я пока еще не настолько просто манипулирую типами в голове, чтоб ощутить всю ситуацию, хорошо хоть в целом могу медленно прости по шагам по коду, но есть ощущение, что что-то здесь не так.

#DEENSA (6+1) / @kb / 4027 дней назад

Какая XMPP-либа нынче наиболее пригодна для реализации XMPP-based протокола (Infinote)?

#87JCZ9 (16) / @l29ah / 4033 дня назад

[22:29:29]<L29Ah_> haskell way: библиотек нет, а те, что есть, сделаны в трёх несовместимых инкарнациях
[22:30:16]<L29Ah_> какой в платформе сорт кондуитов и линз?
[22:30:44]<qnikst> никакого
[22:30:51]<qnikst> и не будет

#56T1W8 (0) / @l29ah / 4038 дней назад

Опубликовал мюслекалькулятор: https://github.com/l29ah/muesli
Patches are welcome!

#LE1G2R (1) / @l29ah / 4081 день назад

А поясните мне за песочницы: разве они не должны наследовать пакеты, установленные в системе и у пользователя?

Я почему спрашиваю: pandoc-1.9.4.5 не собирается в sandbox (похоже, там кто-то захардкодил пути и sh не может найти какой-то файл), так что я поставил его под юзером (то есть в ~/.cabal). Но после того, как я делаю cabal sandbox init, cabal list pandoc утверждает, что установленных версий pandoc нет. Я что-то делаю не так, или я чего-то не так понял?

#LJI5CA (0) / @minoru / 4081 день назад

Как на хаскеле создать DSL, если haskell не умеет в расширение и изменения синтаксиса языка? Поясните по хардкору.

#XKU4NT (1) / @ninesigns / 4097 дней назад

Считаете, что монадные трансформеры это сложно?

Попробуйте разобраться с syntax model в racket!

#YDNPWW (0) / @ninesigns / 4108 дней назад

Нас было 7 человек. У нас было 20 модулей на хаскеле, приватный репозиторий на гитхабе, 6 веток в этом репозитории, ImplicitParams, MagicHash и UndecidableInstances в коде и одна highmem нода на амазоне, а также hangouts для общения, юнит-тесты, просто тесты, google docs для заметок и куча статей про SMT-солверы.

#SGNR99 (0) / @ninesigns / 4111 дней назад

$ torify cabal update
Downloading the latest package list from hackage.haskell.org
Segmentation fault

#RE0I13 (0) / @ninesigns / 4113 дней назад

Кстати, надо бы наверное сделать специальный обфускатор для хаскеля. Работать он будет так:

  1. сперва пишем обычный, нормальный код.

  2. автоматически заменяем все имена на бессмысленные f, g, x etc.

  3. у нас получается некоторое дерево вызовов, проводим замену его поддеревьев по определенным rewriting rules, например дерево (f x) на f $ x, f (g x) на (f . g) x, то что сделал ты с f $ g <*> h и т.п., потом проводит «депоинтизацию», убирая где можно аргументы.

Ну то есть делаем то, что сделал ты. Только автоматически. И с этого моменты хаскелисты перестают быть нужными — т.к. весь их арт оказывается легко и непринужденно может быть исполнен автоматическим обфускатором.

ЗЫ: обрати внимание на первый пункт — получить обфусцированный код можно только тогда, когда нормальный код уже есть. Это к слову о любителях ненужной работы.

#2IKVRF (0) / @ninesigns / 4114 дней назад

ghc doesn't fuse lists (avoiding success at all costs?)

http://stackoverflow.com/a/17345377/2350060

#4XPJQ8 (0) / @minoru / 4150 дней назад

https://research.microsoft.com/en-us/um/people/simonpj/papers/ndp/haskell-beats-C.pdf

Abstract
Stream fusion [6] is a powerful technique for automatically transforming high-level sequence-processing functions into efficient implementations. It has been used to great effect in Haskell libraries for manipulating byte arrays, Unicode text, and unboxed vectors. However, some operations, like vector append, still do not perform well within the standard stream fusion framework. Others, like SIMD computation using the SSE and AVX instructions available on modern x86 chips, do not seem to fit in the framework at all.
In this paper we introduce generalized stream fusion, which solves these issues. The key insight is to bundle together multiple stream representations, each tuned for a particular class of stream consumer. We also describe a stream representation suited for ef ficient computation with SSE instructions. Our ideas are implemented in modified versions of the GHC compiler and vector library. Benchmarks show that high-level Haskell code written using our compiler and libraries can produce code that is faster than both compiler- and hand-vectorized C.

На ассемблере такие вещи надо делать. Алсо, тут http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=gcc&lang2=ghc&data=u64q хаскель сливает сишке почти по всем пунктам. И я бы не сказал, что кода на х-е сильно меньше, чем кода на Си

#BAHBZO (7) / @j123123 / 4152 дня назад

сами хаскелеры как правило охуенные программисты, выбравшие хаскель по ряду причин, проработав и на других языках и зная разницу (как, вобщемто и я) между хаскелем и не хаскелем.

#II3PTB (2) / @ninesigns / 4188 дней назад

Товарищи, я тут в жуйках итд вижу много вопросов по хаскелю, как разрулить ту или иную проблему итд.

Так это, хаскеллисты, расскажите над какими проектами вы вообще работаете?

#LVSV7G (17+1) / @ninesigns / 4198 дней назад

Ну чо, кто готов?

A solid background in computer science, documented experience and/or strong academic education in advanced functional programming in Haskell are assumed. Knowledge of type systems, Martin-Löf type theory, dependent types, formal methods, static analysis, MSR Code Contracts, hardware verification, HDLs, Spec#, Coq, Agda, Idris, Epigram, Twelf or other similar tools, languages, theorem provers is desirable but not required. Knowledge of parsing, skills also in other programming languages including experience from C, C#, C++, Objective-C and also Scala, is also desirable but not required. Higher academic degrees such as a PhD in computer science are not required but certainly taken into account. Entrepreneurship skills or industrial experience is not required here – but if such exists it is considered to be a strong merit as well. Knowledge in UNIX and Linux is required. Finally, experience from using Visual Studio, Eclipse or other IDEs is relevant.

#6600NK (1) / @ninesigns / 4205 дней назад

@qnikst на Juick предлагает коллективно разобрать книгу «Purely Functional Data Structures» Окасаки. Присоединяйтесь! http://juick.com/2339137

#6NLVOG (1) / @minoru / 4213 дней назад

Часто слышу следующие доводы за сабж:

  • Статическая типизация - тесты не нужны.
  • Иммутабельность данных - организация concurrency превращается в тривиальную задачу;
  • Благодаря сигнатурам функций не нужна документация;
  • Если где-то при рефакторинге поменять тип, то компайлер покажет где еще чо нужно поменять, чтоб программа собралась, PROFIT;
#FLKH71 (7) / @ninesigns / 4234 дня назад
--
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.