
Maxim
09.05.2018
20:46:49
аля-make файлы это cabal
де-факто система сборки
начни с неё, гуглить cabal new-build насколько я понимаю (? тут некоторым)

A64m
09.05.2018
20:48:37
тем временем лин.типы пошли в комитет, но как-то неуверенно:
> usually, when a proposal has been submitted, I just pick a shepherd. But I feel the linear types proposal, is not something I can just impose on any of you.
> Therefore, I’d like to have a volunteer to step forward and claim this
one.
> Any takers?
(пока добровольцев нет)

Google

Dmitry
09.05.2018
20:49:29

A64m
09.05.2018
20:51:25
тем временем автор или-паттернов:
> clearly @mchakravarty is too busy for this, can we assign this to someone else?
и в ответ:
> I am sorry for being slow. I'll do it this month. (The trouble with this proposal is that I need to read it and it is long and complex.)
когда вошел в рулевой комитет, а там ВНЕЗАПНО НАДО ПРОПОЗОЛЫ ЧИТАТЬ
ну кто бы мог подумать, а?

Pavel
09.05.2018
20:53:34

A64m
09.05.2018
20:53:52

Yuuri
09.05.2018
20:54:31

Pavel
09.05.2018
20:56:03

A64m
09.05.2018
20:56:44
думаю, что хаскельные недоиде плохо подходят для начинающих, потмоу что требуют обычно доработки напильником

Pavel
09.05.2018
20:57:16
в общем простой текстовый редактор с подсветкой синтаксиса должно быть самое оно

A64m
09.05.2018
20:58:13
также, языковой сервис для них всегда надо самому собирать, и это большой и сложный хаскельный проект обычно, так что требуется некоторый опыт использования хаскельных билдтулов

Pavel
09.05.2018
20:59:44
да, понимаю. благодарю всех за советы и рекомендации ?

Dmitry
09.05.2018
21:00:53

Pavel
09.05.2018
21:01:42

Google

Yuuri
09.05.2018
21:02:31

Pavel
09.05.2018
21:04:09

A64m
09.05.2018
21:05:16
у меня vscode c Haskell Language Server

Yuuri
09.05.2018
21:07:02
Обошёлся бы одним емаксом, но за долгие годы так и не смог сдружиться с фортепианным интерфейсом и конфигуряемостью всего (часто через одно место) :(

Yuriy
09.05.2018
21:10:35
опять редакторосрач? уже кто-нибудь сказал, что емакс и вим для динозавров?

Maxim
09.05.2018
21:12:02
где срач?
нет срача

Yuriy
09.05.2018
21:15:51
эх, хаскельру уже не тот

Yuuri
09.05.2018
21:22:58

Alister
09.05.2018
21:45:16

Арсений
09.05.2018
21:51:08
Ну есть spacemacs, там довольно классно подсказки сделаны

kana
09.05.2018
22:20:04
на самом деле черчевая (фриир?) версия куда более наивная
ведь именно там именно что конструктор для бинда
то есть если не видеть Free (f (Free f a)), но быть знакомым со свободными структурами (но не с универсальной free для всего), то до freer догадаться вроде проще

Denis
09.05.2018
22:22:28
Free надо юзать, когда вот прям в этой функции надо обрабатывать синтаксическое дерево. Интерпретировать его там или менять в нем что-то, а Church надо использовать, когда это дерево конструируешь, потому что иначе >>= является O(n) по сложности вместо O(1), потому что каждый раз приходится по всему дереву пробегать, чтобы к нему что-нибудь в конец добавить


kana
09.05.2018
23:05:32
думается мне, это самая наивная (но конечно далеко не самая эффективная) реализация фри-монады:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
import qualified Control.Monad.State as S
import Data.Kind
type f ~> g = forall x. f x -> g x
data Free :: (Type -> Type) -> Type -> Type where
Pure :: a -> Free f a
Lift :: f a -> Free f a
Map :: (x -> a) -> Free f x -> Free f a
Apply :: Free f (x -> a) -> Free f x -> Free f a
Bind :: Free f x -> (x -> Free f a) -> Free f a
instance Functor (Free f) where
fmap = Map
instance Applicative (Free f) where
pure = Pure
(<*>) = Apply
instance Monad (Free f) where
(>>=) = Bind
foldFreeM :: forall f m. Monad m => (f ~> m) -> (Free f ~> m)
foldFreeM run = go where
go :: Free f ~> m
go (Pure x) = pure x
go (Lift m) = run m
go (Map f m) = fmap f (go m)
go (Apply mf mx) = go mf <*> go mx
go (Bind mx f) = go mx >>= (go . f)
data MyStateF s a where
Get :: MyStateF s s
Put :: s -> MyStateF s ()
type MyState s a = Free (MyStateF s) a
runMyState :: s -> MyState s a -> a
runMyState state m = S.evalState (foldFreeM go m) state
where
go :: MyStateF s ~> S.State s
go Get = S.get
go (Put s) = S.put s
get :: MyState s s
get = Lift Get
put :: s -> MyState s ()
put = Lift . Put
modify :: (s -> s) -> MyState s ()
modify f = get >>= (put . f)
main :: IO ()
main = putStrLn $ runMyState (5 :: Int) $ do
x <- get
modify (+ 1)
y <- get
pure $ "Before: " ++ show x ++ "\nAfter: " ++ show y
https://gist.github.com/kana-sama/b1efb103cf2af329ef072f8b60bdc2e0


Victor
10.05.2018
00:34:46

Ilya
10.05.2018
02:56:06
кто-то что-то слышал или может сказать про DFinity?

Google

Nick
10.05.2018
03:28:56

Rustem
10.05.2018
04:04:02
Подскажите компилятор/интерпретатор для Haskell на Android
Если есть

Leonid
10.05.2018
04:48:23
GHC fatally broken on Ubuntu 18.04 (Bionic) and other distros. Devs tell everyone that there won't be a fix for 8.4. Who do we ask for help here?
http://reddit.com/r/haskell/comments/8ic3c5/ghc_fatally_broken_on_ubuntu_1804_bionic_and/
Не смогли избежать успеха. Теперь пользователи ghc даже патч не могут

Pavel
10.05.2018
05:52:39

Александр
10.05.2018
06:24:44


A64m
10.05.2018
07:11:56
ну история с дефолтным A развивается понятным образом
> We certainly want to make sure the nursery is not larger than the largest cache. I believe the correct choice almost certainly depends on the amount of parallelism in the program. In a highly-parallel program, the synchronization cost of GC is very high, so we probably want to approach the largest cache. In a mostly-serial program, it may be better to limit the nursery to a smaller, faster cache so the GC mostly hits objects that are already in cache.
сейчас как вместо 1мб вообще 256кб сделают

Дед Пегас
10.05.2018
07:25:25
Вот кстати. Кто сможет объясниь, что такое "криптоэкономика" и чем она отличается от обычной?

Alister
10.05.2018
07:28:13

IC
10.05.2018
07:28:56

Leonid
10.05.2018
07:29:27
В тикете есть

Дед Пегас
10.05.2018
07:30:29

Leonid
10.05.2018
07:31:18
> It's the version from stack.
То о чем предупреждал hvr.

A64m
10.05.2018
07:33:06
так там же и хвровские работать не будут, нет?

Leonid
10.05.2018
07:34:45
Хвр пропатчить может же

IC
10.05.2018
07:34:55
бага то вообще в новом binutils

A64m
10.05.2018
07:35:36
ну так и снойманиты могут

Leonid
10.05.2018
07:35:54
Но не будут

IC
10.05.2018
07:36:10
8.4 в LTS не попал, обновят найтли на минорчик. в чём проблема то?

Google

Leonid
10.05.2018
07:36:27
У снойманитов ghc не дистроспецифичные

A64m
10.05.2018
07:36:32
да будут
правда 8.4.3 вроде как будут делать, так что это не важно

Leonid
10.05.2018
07:38:39
В любом случае требовать релиза для фикса специфичного бага в одном дистре это как-то черезчур

A64m
10.05.2018
07:39:16
ну это достаточно популярный дистр все же

IC
10.05.2018
07:40:45
ну и не очень понятно чем плохо иметь гхц с фиксом для другого "дистрибутива"

Leonid
10.05.2018
07:41:23
Патч же есть

Dmitry
10.05.2018
07:47:09

Дед Пегас
10.05.2018
07:47:51
Хз, не вижу звёздочки.

Leonid
10.05.2018
07:51:16
Мне админа не дают. Боятся лево-либерального террора.

Александр
10.05.2018
07:52:46
Нас одновременно назначили

IC
10.05.2018
07:54:33

Александр
10.05.2018
07:58:34
...Вчера прогонял еще бенчмарки. Ленивая версия modifyTVar из состава нативной STM наглухо виснет в Criterion. Как бы понять, почему?

IC
10.05.2018
07:59:36
Не власти, а спамочистов.

Евгений
10.05.2018
08:11:12

Alexander
10.05.2018
08:38:47
дистрибутивы собирают бинутилсы и добавляют патчи

Maxim
10.05.2018
08:55:23
@qnikst а что, хакпорт не умеет рекурсивно зависимости генерировать?

Google

Alexander
10.05.2018
08:55:34
нет

Maxim
10.05.2018
08:57:12
ну е-мое, зачем он нужен тогда

Alexander
10.05.2018
08:58:43
чтобы ебилды руками не писать

Maxim
10.05.2018
09:00:03
ага, а копаться в стопицот зависимостей все равно надо
хакадж как npm блин, хочешь поставить что-нибудь, вот тебе тонна еще каких-то мелких пакетов с непонятными названиями

Alexander
10.05.2018
09:01:11
мелкие пакеты с непонятными названиями уже есть в репозитории в большинстве

A64m
10.05.2018
09:27:27
работа пошла Марлоу на пользу:
> Increasing the nursery size reduces the cost of GC overall (caches notwithstanding), so the numbers might look good even if you set the default to 20MB on a machine with a 1MB cache.
(но вывод о том, что дефолтный A должен быть побольше далее все равно не следует)

Миша
10.05.2018
10:00:37
Почему такая запись называется бесточечной?
fn = ceiling . cos . max 50

A64m
10.05.2018
10:04:24
> The term originated in topology, a branch of mathematics which works with spaces composed of points, and functions between those spaces. So a 'points-free' definition of a function is one which does not explicitly mention the points (values) of the space on which the function acts. In Haskell, our 'space' is some type, and 'points' are values.

Edgar
10.05.2018
10:05:14
потому что под точкой понимают не символ точки, а точку, в которой функция определяется, здесь это можно переписать как:
fn x = ceiling (cos (max 50 x))то есть ты определил fn в точке x
переписал через композицию, сделал эта-редукцию -- получил бесточечную запись

Александр
10.05.2018
10:05:48

Миша
10.05.2018
10:08:14
Стало понятней. Спасибо.

Евгений
10.05.2018
10:13:06
Называли бы комбинаторной, было бы понятнее

Ilya
10.05.2018
10:15:58
Почему такая запись называется бесточечной?
fn = ceiling . cos . max 50
можно определять
f x = g x (подразумевая for all x)
а можно
f = g
Первое — это поточечное равенство (для любой точки x), второе - бесточечное. чтобы записывать поточечное f x = g (h x) в бесточечной форме f = g . h, нужна операция композиции (.) и другие функции высшего порядка. А то что сама композиция обозначается точкой — это просто забавный казус, не более. В математике она обозначается не точкой, а кружочком, например.

A64m
10.05.2018
10:30:58
в sml-е еще
как все бросились про пойнтфри объяснять. а как сложное что спросят - и молчат все

Imants
10.05.2018
10:33:06
?
Так естественно же.

Александр
10.05.2018
10:33:47
Что вы так сложно объясняете.
f x = g x - вызываем функцию g от того же аргумента, что и функцию f. Фактически, передаем дальше.
f = g - даем другое имя функции g. Ну а раз другое имя того же самого, значит, и аргументов столько же. То есть, запись f x = g x - это тоже "задаем другое имя функции"
Но прелесть в том, что в Haskell между этими вещами - вызовом функции и заданием имени - нет разницы. И это идет еще из лямбда-исчисления, которое можно понимать в двух смыслах: либо как уравнение, либо как вызов функций