LINUX.ORG.RU

169
Всего сообщений: 409

Haskell Platform 8.4.2

Для тех, кто не читает рассылку Haskell Cafe. Вышла новая версия платформы. Не все пакеты еще подтянулись. Например, svg-builder хандрит.

Ох, уж эти любители задавать точные границы для версий пакетов! Никогда их не понимал. Меня самого агитировали, но я отказался.

Спешу успокоить тех, кто далек от Haskell. В stack все работает, как и прежде работало.

 ,

dave ()

Посоветуйте хорошую книгу по Haskell для начинающих.

Желательно чтобы с Hello World начали, а то в тех книгах которые я читал, они сразу начинают со сложных примеров, а дальше идёт запутка.

 ,

ITerator ()

Haskell и Foldable

Всем привет.

Познаю хаскель, наткнулся на проблему.

Есть простое дерево с лесом:

data RoseTree a = RoseEmpty | RoseTree a [RoseTree a]                                  
                    deriving (Show,Eq)

Пытаюсь реализовать для него интерфейс тайпкласса Foldable:

instance Foldable RoseTree where                                                       
    foldr _ acc RoseEmpty       = acc                                           
    foldr f acc (RoseTree x []) = f x acc                                       
    foldr f acc (RoseTree x ts) = let mapped    = map (foldr f acc) ts          
                                      folded    = foldr f acc mapped            
                                  in f x folded

Идея простая: чтобы свернуть список поддеревьев, применяю частично примененный (foldr f acc) к списку, получаю вместо списка поддеревьев (RoseTree a) список значений (a), потом сворачиваю список значений и применяю функцию f к значению ноды из паттерна и свернутому значению поддеревьев.

Но получаю ошибку в ghci:

error:
    • Couldn't match type ‘b’ with ‘a’
      ‘b’ is a rigid type variable bound by
        the type signature for:
          foldr :: forall a b. (a -> b -> b) -> b -> RoseTree a -> b
        at lecture11.hs:131:5
      ‘a’ is a rigid type variable bound by
        the type signature for:
          foldr :: forall a b. (a -> b -> b) -> b -> RoseTree a -> b
        at lecture11.hs:131:5
      Expected type: [a]
        Actual type: [b]
    • In the third argument of ‘foldr’, namely ‘mapped’
      In the expression: foldr f acc mapped
      In an equation for ‘folded’: folded = foldr f acc mapped
    • Relevant bindings include
        folded :: b (bound at lecture11.hs:134:39)
        mapped :: [b] (bound at lecture11.hs:133:39)
        ts :: [RoseTree a] (bound at lecture11.hs:133:29)
        x :: a (bound at lecture11.hs:133:27)
        acc :: b (bound at lecture11.hs:133:13)
        f :: a -> b -> b (bound at lecture11.hs:133:11)

Насколько я понимаю, ругань на то, что частично примененный (foldr f acc) получает на вход список не того типа. Но не могу понять почему, ведь этот foldr есть мой рекурсивный вызов и по идее он должен выглядеть так:

map (foldr f acc) ts

или для примера

map (foldr (+) 0) [RoseTree 1 [], RoseTree 2 [], RoseTree 3 []]

т.е.

[foldr (+) 0 (RoseTree 1 []), foldr (+) 0 (RoseTree 2 []), foldr (+) 0 (RoseTree 3 [])]

и по одной из моих реализаций Foldable RoseTree, где

foldr f acc (RoseTree x []) = f x acc

, получаем [1, 2, 3], что подтверждается пошаговым биндингом этого кода в ghci, но вот целиком ghci мой Foldable не проглатывает.

В чем проблема, парни?

 ,

WaterLine ()

Yesod кто-нибудь в проде использует?

Интересует в качестве RESTful сервиса. Как с нагрузкой? Стоит ли вкладываться? Истории успеха?

Спасибо!

 , ,

mimimimi ()

Галерка хочет мигрировать из Haskell в Rust, но не знает зачем

Дано (на самом деле этот раздел можно пропустить, чтобы не читать простыню, он написан во избежание лишних вопросов): друг работает в конторе с достаточно широким полем деятельности, но повсюду применяющей микросервисную архитектуру, либо просто разрабатывающую небольшие утилиты вроде драйверов, так что, вопросы легаси и т.п. не стоят. Миграция из языка в язык достижима практически без накладных расходов. Уже используются: haskell, c++ + asm, go. Для менее требовательных задач python, ruby, java. К первой тройке недавно добавился rust. Язык весьма зашёл некоторым разрабам, но не всей команде. Прямой руководитель сперва был воодушевлён, но результаты внедрения на практике оказались не столь впечатляющими. Если я правильно понял, ранее написанный драйвер на хаскеле, был переписан на Rust. Там переписывание одного и того же - нормальная практика, так как реальное оборудование не всегда совпадает с тестовым и документацией. Поэтому сперва делается тестовый образец на хаскеле/го, а затем — всё переводят на плюсы. Сейчас попробовали перейти на rust. Оказалось, что линуксовый драйвер написанный на rust с тем же алгоритмом выиграл всего лишь на 4% у хаскельного драйвера (да я тоже удивился, что они используют язык с gc в драйверах, но оказалось, все довольны), при этом разработка заняла 5 недель вместо чуть меньше месяца на хаскеле. Ок, чтобы совсем уж код на rust не выкидывать, переписали с ассемблерными вставками (там это норма). Всё бы ничего, и решили, что если бы писали на плюсах с асмом, вышло бы также по скорости. Вот только, вставки на асме заняли 40% полезного кода (для плюсов там такое тоже норма) и весь драйвер был в unsafe. Короче, они там пришли к выводу, что когда вставок на асме становится слишком много, проще взять плюсы, типа там даже безопаснее получается. Итого, rust рассматривают как замену go и хаскеля. Первых уже потеснили, значит очередь за хаскелистами. И тут разгорелась локальная «святая война». Хаскелисты утверждают, что haskell с монадками и клёвой типизацией якобы на практике не хуже раста, и даже безопаснее. Т.к. кто кого безопаснее пока не выяснили, а аргументы хаскеллистов не понимает никто, кроме них самих, вопрос пока подвис. Конечно, скорее всего они там сами разберутся, чай не дураки, гуглить умеют, но вдруг здесь у кого есть интересное чтиво по данному вопросу.

Самому мне всё равно: с одной стороны, оба языка мне нравятся, с другой, лично для моих задач они не подходят. И к сабжевой конторе отношения не имею. А вот друг - там и имеет некоторый интерес перейти с плюсов на раст (на го и хаскель не хочет), подыскивает доводы, чтобы убедить начальство.

Собственно вопрос: где бы найти почитать взвешенный сравнительный анализ хаскеля и раста? Там с нормальным сравнением производительности, особенно (!) безопасности и прочее.

 ,

next_time ()

трансляторы из common lisp в c# f#

Интересны концепции/исходники трансляторов подмножества clos в мейнстримовые ооп-языки.

Нахожу только варианты с edsl для cl, который транслируется в целевой язык банальной подстановкой блоков кода, например, на c++ (arduinolisp). То есть ограничим язык edsl, а потом еще раз ограничим подстановкой готовых блоков.

Из не такого тривиального нашел только parentscript, но он для js.

 , ,

panzerito ()

Есть ли где почитать о том, как Хаскелль внедряют в продакшен?

Можно (и даже нужно) на английском. Желательно из первых рук. Какие косяки и как они решаются.

Спасибо заранее.

 , , , ,

mimimimi ()

Хочу освоить xmonad

Сабж. Вопроса 3:

  1. насколько нужно хорошо знать haskell, чтобы уверенно склепать свой xmonad-конфиг с разными хотелками?
  2. возможно ли в xmonad управлять политикой перемещения окон? Какое окно куда пойдет в тайлинге при нажатии таких то клавиш. Не между столами, а именно внутри одного стола.
  3. как дела с обратной совместимостью при обновлении версий? Нужно будет капитально переписывать конфиг как было в осоме или все лучше?

 ,

Annoxial ()

Как вы дебажите код написанный на этих ваших чистых ФП языках?

Есть какие нибудь гайдлайны? Как писать реальный код (не расчет факториала и числа Фибоначчи), который потом будет легко отлаживать?

В лиспах например могу куда угодно воткнуть PRINT, перекомпилировать проблемную функцию, запустить и посмотреть, что там происходит в репле + есть хороший дебаггер.

 , ,

mimimimi ()

Опция -threaded в haskell

Вопрос касается кода, скомпилированного с помощью -O2 -threaded и запущенного с помощью +RTS -N.

Обычно измерял скорость однопоточных приложений на haskell. Там вычисления, и со скоростью все очень и очень хорошо. С нагрузкой на процессор - тоже.

Тут понадобилась опция -threaded. И что я вижу: на алгоритмически однопоточном коде на процессоре Intel с двумя ядрами и гипертредингом нагрузка под 70% (от максимальной 100%) при использовании опций запуска +RTS -N. А потоков создается не меньше десяти! Как будто загружены 3 ядра из 4-х. Меня это удивило, мягко говоря. Подозреваю, что black holes имеют определенную стоимость в многопоточном коде, как и RTS.

Если взять тот же самый код, но без -threaded, то он отрабатывает на доли процента быстрее, с загрузкой всего 1 ядра и с 2-я потоками в окне Мониторинга Системы, где активным, скорее всего, является всего один поток.

Есть какие-нибудь оценки по этому поводу? На сколько ядер нужно рассчитывать про запас, чтобы, скажем запустить код с 4-я активными потоками, или с 8-ю?

Цель в том, что нужно показать хорошую масштабируемость одной штуки, а тут такой облом. Подозреваю, что нужно, минимум, 8 ядер, пусть виртуальных, чтобы делать какие-то выводы

 

dave ()

Поясните за монады

Вот есть, например, тип Score. И есть монада Thread_lifetime.

(Score -> Score) -> Thread_lifetime Score -> Thread_lifetime Score
Допустим, был у меня скор 90. Создаю я тред 𐑨𐑤𐑓𐑨𐑝𐑦𐑑𐑩𐑫 𐑚𐑧𐑮𐑵𐑨𐑮𐑛𐑨 𐑖𐑩𐑪. Тред сносят, ибо нефиг 𐑒𐑮𐑨𐑒𐑩𐑟'𐑨𐑚𐑮𐑨𐑫𐑦 𐑐𐑦𐑕𐑨𐑑'. После этого скор находится в недетерминированном состоянии где-то в {70..90} (монада Шрёдингера, пока не снесут — не узнаешь). А ещё в зависимости от того, как на сутки по МСК накладывается лайфтайм и когда создан аккаунт, скор может вырасти. А ещё он может изменяться в зависимости от лайфтайма других тредов и комментариев. Причём в текущий момент конец их лайфтайма обычно неизвестен, если только ты не спамер и не вальман. А ещё могут за аватарку скор снять. А ещё не следует исключать фактор полезшего напрямую в базу Макскома или потустороннего русского хакера... Вот как бы всё это учесть?!..

Перемещено tailgunner из development

 , , , ,

bodqhrohro_promo ()

Есть ли для Haskell библиотека для представления монетарных величин

и операции над ними?

Или можно набросать прототип здесь, если не трудно ;). Спасибо.

Хочу попробовать переписать под Идрис.

 , ,

mimimimi ()

Посоветуйте литературу и нормальную документацию к Haskell

Сабж. Желательно на русском языке.

 ,

playX ()

Тупняк и Idris

Есть функция:

squareHead : Num a => List a -> a
squareHead (x :: xs) = x * x

по хорошему, оно компилироваться не должно (но компилируется).
В Haskell при пустом списке оно просто выкинет exception, а здесь оно возвращает что-то не совсем понятное:
λΠ> squareHead []
squareHead [] : Integer
λΠ> cast (squareHead []) / 3.0
prim__divFloat (prim__toFloatBigInt (squareHead [])) 3.0 : Double

ЯННП.

 , , ,

Unununij ()

Помогите скомпилировать бинарник (haskell)

Добрый день, ЛОР!

Кто тут спец по haskell? Если не сложно, скомпилируйте мне, пожалуйста, бинарник hledger-iadd

https://github.com/hpdeifel/hledger-iadd

stack install --resolver=nightly hledger-iadd

Не смог собрать через stack ни на Debian Stretch ни на Debian Buster.

 

aquadon ()

fpconf

http://fpconf.ru/

2 декабря в москве будет конференция посвящённая функциональному программированию

Кто-то ещё из лоровцев собирается сие посетить?
Если да, давайте как-то мб организуемся чтоб там увидеться

 , , , ,

oxo ()

Хикке и static typing

Шок, видео:
https://www.youtube.com/watch?v=2V1FtfBDsLU
[само действо с ~20 минуты]

«I think types are an antipattern for program maintenance and extensibility.»

 , , , ,

Unununij ()

Вернуть haskell-mode

Глупый вопрос, но во что превратили старый добрый haskell-mode? Как вернуть удобный REPL и команду Ctrl-C + Ctrl-L?

Когда у них там начались пертубации, то старый режим, который мне так нравился, назвали deprecated. И был какой-то способ его вернуть. А сейчас с ходу не нашел.

На это можно взглянуть и с другой стороны. Просто появился очень хороший и веский повод взглянуть на поддержку haskell в atom

 ,

dave ()

Laziness WAT

Я решил попробовать посмотреть, понимаю ли я как работает ленивость в ghci, в итоге у меня получилась следующая сессия:

Prelude> let x = (id True, id undefined)
Prelude> :sprint x
x = _
Prelude> let x = (True, id undefined)
Prelude> :sprint x
x = _
Prelude> let x = (True, undefined)
Prelude> :sprint x
x = (,) True _
Prelude> let x = (True, undefined::Int)
Prelude> :sprint x
x = (True,_)
Prelude> let x = (True, False)
Prelude> :sprint x
x = (True,False)

но я абсолютно не понимаю, почему я получаю такие результаты.. Может ли кто-нибудь помочь разобраться?

 , ,

qnikst ()

Замена SNMP для мониторинга?

Возник вопрос в выборе средства мониторинга (распределенного кластера). Присматриваюсь к SNMP, но что-то мне оно не нравится. Эдакое чудище из прошлого. Может быть, есть более интересные варианты?

С SNMP немного имел опыт работы. Использовалась одна свободная реализация, которая запомнилась тем, что она работала в зависимости от фазы луны. На одном дистре и с одной версией работает, а на другом дистре и с другой версией - нет. Меняем версию - пашет. Конечно, дело не в самой технологии SNMP, а в ее частной (и очень распространенной) реализации, но все же.

В пользу SNMP говорит то, что вокруг этой технологии существует целый рынок. И конечно, приятно, когда SNMP-оповещания идут прямо на специализированную аппаратуру, отображаясь в виде мигающих лампочек.

Однако, меня интересует SNMP в плане применения в Haskell. Нашел два пакета на Hackage DB. Один из них даже попадал в Stackage. Только такое чувство, что пакеты слегка заброшены.

Почему еще возникает вопрос о поиске замены. Просто есть определенный опыт использования JMX, эдакой альтернативы SNMP, но для мира Java. И даже знаю один случай, где было написано собственное веб-ориентированное средство мониторинга со своим собственным протоколом, которое успешно используется до сих пор.

Так что принято использовать в 2017 году для мониторинга?

 ,

dave ()