Aleksei (astynax)
в [IOAction] не получится сделать ветвление в зависимости от состояния мира...
Aleksei (astynax)
Только если дерево накапливать
Евгений
В моё время IO был явно записан как "State RealWorld a" :) Как щас хз
Aleksei (astynax)
Да примерно также. Но ведь State, это как раз про конструирование длинной лямбды, через которую будет протащен в данном случае "реальный мир" :)
Aleksei (astynax)
поэтому когда мы пишем foo = print 42 >> print 24 никакой печати не происходит на момент определения - просто конструируется значение
кана
Значение типа Print 42 (\() -> Print 24 (\() -> Done))
кана
Или обернуто все во free?
Евгений
Да примерно также. Но ведь State, это как раз про конструирование длинной лямбды, через которую будет протащен в данном случае "реальный мир" :)
Я не уверен, что такие понятия лучше, чем представления о "контейнерах". В конце концов мы ведь, формально, описываем один огромный лямбда терм, который начинает редуцироваться при запуске программы
Aleksei (astynax)
\world -> (let newWorld = with world (Print 42) in \world -> ...
Евгений
И правильно говорить на языке редукций, если мы хотим не аналогии строить, а "понимать сущность языка"
Aleksei (astynax)
Или обернуто все во free?
Незачем оборачивать во Free, т.к. интерпретатор всегда один
Anatolii
Не хватает @qnikst
Anonymous
Да, он с 10 числа не показывается
Vladislav
Аппликатив почти как монада, только тензор не compose, а day convolution.
Vladislav
мне нравится альтернативное определение Applicative через <++> :: f a -> f b -> f (a, b), без аппликаторов если ты рассматриваешь f как какой-то эффект, то получается, что <++> просто выполняет оба эффекта и ничего не делает с самими значениями. Что-то вроде моноида. В некоторых случаях там вообще напрямую моноид проглядывает – ну например Const x a у тебя будет аппликативом, если x моноид, и тогда <++> или <*> эти иксы тупо сложит: > :t (<*>) @(Const String) (<*>) @(Const String) :: Const String (a -> b) -> Const String a -> Const String b > Const "foo" <*> Const "bar" Const "foobar" как понять списки через эффекты или контексты, я без понятия (у меня никогда не получалось нормально), поэтому я просто запомнил, что со списками обычно можно твердить про себя “декартово произведение, декартово произведение” и вроде обычно работает. Есть ещё много штуковин, которые через эффекты мне сложно понять, и там приходится тоже запоминать, что будет делать Applicative/Monad
Vladislav
^ поэтому такое его понимание самое близкое к формализации
Vladislav
А любой аппликативный функтор является также и монадой, потому что day convolution можно конвертировать в compose: dayToCompose :: (Functor f, Functor g) => Day f g a -> Compose f g a dayToCompose (Day fb gc k) = Compose ( fb <&> \b -> gc <&> \c -> k b c)
Vasiliy
> любой аппликативный функтор является также и монадой
Vasiliy
ну нет, например
Viacheslav
не например
Viacheslav
а прям очень точно
Viacheslav
но любая монада — это аппликативный функтор
кана
day convolution это вообще что-то дикое
Anonymous
Wait, wat. Реализуй instance Monad ZipList, например
Anonymous
> любой аппликативный функтор является также и монадой
Anonymous
ну нет, например
Anonymous
не например
Anonymous
а прям очень точно
Vladislav
Местами поменяйте
Vladislav
Любая монада является аппликативным функтором.
Vladislav
(что я хотел сказать)
Anonymous
Какую связь имеют монады и Compose, вообще? Compose - это операция над функторами
Vladislav
type f ~> g = forall a. f a -> g a return :: Monad m => Identity ~> m join :: Monad m => Compose m m ~> m
Vladislav
такую связь, монада задается двумя натуральными трансформациями
Vladislav
одна из identity-функтора, другая из композиции
Vladislav
Они соответствуют mempty и mappend, которые задаются так: mempty :: Monoid m => () -> m mappend :: Monoid m => (m,m) -> m
Vladislav
либо pure и liftA2, которые задаются так: pure :: Applicative f => Identity ~> f liftA2 :: Applicative f => Day f f ~> f
Vladislav
и мы можем написать pure = return liftA2 = join . dayToCompose чтобы из монады получить аппликатив
Anonymous
А, ну это-то да. Я просто недоумевал, как из аплликатива монаду сделать
Vladislav
https://stackoverflow.com/a/45236774/1486400
Vladislav
Хорошее объяснение синглтонов
кана
Я понял, кажется. Под эффектом понимается не что-то impure в контексте всей программы (как то, что происходит над main функцией), а любое неявное изменение контекста над нашим контекстом. Типа, как меняется состояние у некой функции f с State монадой (состояние меняется над этой функцией, а функция вызывается в контексте этого состояния).
кана
То есть эффект - понятие относительное
Andrey
Бинго
a66ath
@kana_sama в функтор тоже можно засунуть функцию
Vladislav
То есть эффект - понятие относительное
Разница между эффектом и сайд-эффектом в том, что отражается в сигнатуре
Vladislav
State s дает стейт как эффект, глобальная переменная дает стейт как сайд-эффект
Vladislav
А что считать эффектом — это уже более спорный вопрос. Обычно за эффект применяется всё, что функция делает кроме возврата результата, но что относить к результату спорно. Потому что, например, a -> State s b можно рассмотреть как функцию, которая принимает a и возвращает State s b (без эффектов), либо как функцию, которая принимает a и возвращает b (с эффектом State s)
Vladislav
И в Хаскеле есть сайд-эффекты (исключения и non-termination).
Vasiliy
а разве non-termination - это эффект?
Vasiliy
получается, функция без эффектов - это тотальная функция, так что ли?
Vladislav
Да
Vladislav
А в Coq/Agda, например, для частичных функций используется монада Partiality
Vladislav
Т.е. они явно этот эффект кодируют.
Andrew
Подскажите пожалуйста. У меня не компилируется исходник: ghc -o simple Main.hs SimpleJSON.o Linking simple ... /usr/bin/ld: cannot find -lHSbase-4.9.1.0 /usr/bin/ld: cannot find -lHSinteger-gmp-1.0.0.1 /usr/bin/ld: cannot find -lHSghc-prim-0.5.0.0 /usr/bin/ld: cannot find -lHSrts collect2: error: ld returned 1 exit status `gcc' failed in phase `Linker'. (Exit code: 1) Система archlinux, ghc 8.0.2, установлен xmonad как основная оболчка.
Vladislav
GHC установлен как-то странно — не может прилинковаться к основным библиотекам и даже RTS.
Andrew
Спасибо,
Andrew
кажется я нашел https://wiki.archlinux.org/index.php/haskell#Problems_with_linking
Alexander
что тут нового за 2 недели?
Dmitrii
GHC 8.2.1 вышел наконец-то (сегодня)
Alexander
о круто
Vladislav
Alexander
lib:ghc можно пересобирать будет!
Alexander
похоже пока только с cabal-install правда
Serghei
а кто-то юзает эту штуку для хаскела? https://github.com/syl20bnr/spacemacs
Anonymous
мне не понравилась эта штука
Serghei
а можно четь подробней, почему?
Serghei
я еще не щупал, но мне интересно
Влод
кто использует пишите сразу про свою конфигурацию с реплом (ну не названия, а как там жизнь в целом)
Aleksei (astynax)
spacemacs вроде стандартные штуки использует - ghc-mod, intero или inferior процесс на выбор
Aleksei (astynax)
Остальное - биндинги и нестройки отдельных емаксопакетов
Aleksei (astynax)
Спейсмакс вообще ничего своего не привносит в сущности (в плане библиотек), только идеологию и модель слоёв
Serghei
а как же фича " configuration layers" ?
Serghei
я из-за расказов про нее (хвалебных конечно же) решил вот попробовать
Aleksei (astynax)
> и модель слоёв
Serghei
а
Serghei
сори
Aleksei (astynax)
тамошние слои, это просто распиленный на куски конфиг :)
Aleksei (astynax)
С use-package любые слои делаются "на раз"