
Александр
17.06.2018
08:39:31
Так это единичный случай, или он по другим поводам тоже обещает сделать?

Leonid
17.06.2018
09:10:52

Artem
17.06.2018
09:16:13

A64m
17.06.2018
09:49:43
https://github.com/ghc/ghc/commit/60e4bb4d305bc1a65457ee79b1e69c11b9ed747d

Google

A64m
17.06.2018
09:51:06
ну ладно, но за D4766 я больше переживаю

Vladimir
17.06.2018
09:52:14
неужели этот бойлерплейт нельзя было по-человечески написать?
какой-нибудь редукцией свести к какой-нибудь форме, ну

Yuriy
17.06.2018
09:54:07

A64m
17.06.2018
09:54:44
смотря какие
это, наверное, должно несколько улучшать код где в анбоксед/сторабл векторах какие-то сложные структуры вложены и инстансы для анбоксед не написаны как вектор рекордов -> рекорд векторов. т.е. как в Linear
но эту гипотезу я не проверял

0x739d6cd673fffb80
17.06.2018
10:29:13
Как к функции типа a -> b -> c -> IO d применять IO-аргументы? >>= работает только с унарными. a, b, и c нужно как-то объединить?

Ilya
17.06.2018
10:29:48
do-нотацию знаешь? хотя тут можно и без неё
do
a <- ma
b <- mb
c <- mc
f a b c
ma, mb, mc — это твои IO-аргументы, f -- функция

0x739d6cd673fffb80
17.06.2018
10:33:23
А как без do это будет выглядеть?

kana
17.06.2018
10:33:59

Google

kana
17.06.2018
10:34:53
join :: Monad m => m (m a) -> m a
liftA2
:: Applicative f
=> (a -> b -> c) -> (f a -> f b -> f c)
join . liftA2
:: Monad m
=> (a -> b -> m c) -> (m a -> m b -> m c)
с учетом аргументов композиции, то есть тут . абстрактный
print3 :: String -> String -> String -> IO ()
print3 a b c = print $ a ++ b ++ c
main :: IO ()
main = join $ liftA3 print3 getLine getLine getLine

Ilya
17.06.2018
10:36:59

Yuriy
17.06.2018
10:38:00
через do будет понятнее спрашивающему

kana
17.06.2018
10:38:15
ну у него был конкретный вопрос: "как без do?"

Yuriy
17.06.2018
10:39:42

Ilya
17.06.2018
10:41:02
Аппликативы рулят!

kana
17.06.2018
10:41:18
на самом деле я не считаю, что с ду однозначно понятнее, потому что с liftAN код выглядит как просто применение функции, а в do придется выдумывать имена
то есть было f a b, стало liftA2 f a b

Ilya
17.06.2018
10:41:25
Но "без-ду-шная" нотация это 5+
В одну копилку с pointless

kana
17.06.2018
10:42:13
а вот ввели бы bang как выражение
main = f (<- a) (<- b) (<- c)

0x739d6cd673fffb80
17.06.2018
10:42:54
Кстати, какой лимит N в функциях liftN и подобных? Они автоматически генерируются?

kana
17.06.2018
10:43:20
http://hackage.haskell.org/package/base-4.11.1.0/docs/Control-Applicative.html
определены до 3
но
liftA3 f a b c = f <$> a <*> b <*> c
liftA4 f a b c d = f <$> a <*> b <*> c <*> d
liftA5 f a b c d e = f <$> a <*> b <*> c <*> d <*> e

A64m
17.06.2018
10:44:36

kana
17.06.2018
10:44:37
то есть они пишутся тривиально и можно вообще без lift

Ilya
17.06.2018
10:44:42
@kana_sama зацени
https://stackoverflow.com/questions/49628762/lifting-generalization

kana
17.06.2018
10:45:12

Google

A64m
17.06.2018
10:45:30
это страшно Ж(((

kana
17.06.2018
10:45:36
да нет

A64m
17.06.2018
10:45:42
пропозал вообще страшнейший

kana
17.06.2018
10:45:53
do дает в "синтаксический скоуп" <-

A64m
17.06.2018
10:45:59
по сравнению с идрисным синтаксисом

kana
17.06.2018
10:46:01
как "стейтмент", так и выражение

Index
17.06.2018
10:46:17
https://github.com/ghc/ghc/commit/8df24474d0194d28b8273c1539af05793156e23f
Предписываю всем -Werror=implicit-kind-vars теперь включать
Через 2 релиза все равно сломаю
Т.е. если не включить сейчас, то через 2 релиза код сломается.

kana
17.06.2018
10:46:53

Denis
17.06.2018
10:57:29
Всегда можно сделать n+1 имея liftN
liftN+1 = (<*>) + liftN

0x739d6cd673fffb80
17.06.2018
10:58:22

A64m
17.06.2018
10:59:14
(причем заброшенный уже, вроде)

kana
17.06.2018
11:09:54
[большая горечь]

A64m
17.06.2018
11:31:45
To do this, we formalize the notion of kind, writing * for the kind of
all types and k1 -> k2 for the kind of a constructor which takes
something of kind k1 and returns something of kind k2. This notion
comes is motivated by some theoretical work by Henk Barendregt on the
subject of `Generalized type systems'; Do not confuse this with the use
of the symbol * in a certain well-known functional language where it
represents a type variable. These things are completely different!

0x739d6cd673fffb80
17.06.2018
11:47:41
А как должна выглядеть аналогичная, которая получает из него данные?

Aleksey
17.06.2018
11:51:05
game ^. boss . health

0x739d6cd673fffb80
17.06.2018
12:06:20

Google

A64m
17.06.2018
12:26:24
емнип use (boss.health)

kana
17.06.2018
12:30:14
health' <- use $ boss . health
можно сразу и менять, и получать:
health' <- boss.health <-= 10
как заметил @astynax, можно через gets
health' <- gets $ view $ boss.health
собственно use = gets . view

0x739d6cd673fffb80
17.06.2018
12:57:25
В чем разница между runStateT и execStateT?
Последний не пропускает эффекты IO?

kana
17.06.2018
12:59:51
run отдает и стейт, и результат вычисления в монаде
exec отдает только стейт в монаде (когда результат вычисления не важен)
это почти ко всем основным mtl-монадам относится

Admin
ERROR: S client not available

kana
17.06.2018
13:00:46
у своих я тоже такого нейминга придерживаюсь
есть еще evalStateT, который отдает только результат

0x739d6cd673fffb80
17.06.2018
13:04:25

kana
17.06.2018
13:04:44
будут, покажи код

Alexander
17.06.2018
13:05:34
будут конечно работать

kana
17.06.2018
13:05:58
program :: StateT Int IO ()
program = do
liftIO . putStr $ "inner state: "
liftIO . print =<< get
modify (+ 10)
main :: IO ()
main = do
state <- execStateT program 20
print $ "result state: " ++ state
вывод:
inner state: 20
result state: 30

Imants
17.06.2018
13:20:48

Alexander
17.06.2018
13:34:19
а http://hackage.haskell.org/package/gtk норм или есть что то более актуальное?

Aleksey
17.06.2018
13:45:41

Yuriy
17.06.2018
13:51:06

Imants
17.06.2018
14:15:39

kana
17.06.2018
14:48:08
Ну имхо от voidState интуиции не больше, чем от execState

Aleksey
17.06.2018
14:56:06

Google

Александр
17.06.2018
16:11:22
А я всегда путаю eval / exec ?

A64m
17.06.2018
16:13:16
у eval должен быть результат, очевидно
так что перепутать сложно
вообще же eval и exec, наверное, от того, что mtl происходит из пейпера про модульные интерпретаторы

Александр
17.06.2018
16:14:21
> Но логика есть и в текущем именовании - exec делается ради эффекта, а eval ради вычисления значения
Вот это, пожалуй, поможет мне запомнить, кто из них a, а кто s

Антон
17.06.2018
16:26:38

A64m
17.06.2018
16:28:04
да, и * и бокс из пейпера Барендрегта взял и применил (когда изобретал конструктор классы) Марк Джонс - автор хаскельных фич 90 которые так ненавидят любить и любят ненавидить хаскелисты
можно считать что все виновные установлены, Тернер и Милнер не при чем
бокс, кстати, не имеет отношение ко всяким боксед-лифтед, это просто квадратик из Барендрегтовского пейпера словом

Антон
17.06.2018
16:32:59

A64m
17.06.2018
16:37:53
> Why do this? One alternative is to go the route of Coq and Agda and have an infinite tower of type universes. But, this adds a lot of complexity. These languages take this route because * :: * makes a language inconsistent as a logic. However, Haskell is already inconsistent as a logic (because of undefined and GHC.Exts.Any) and so we don't have to worry about a new source of inconsistency. Furthermore, the type safety of Haskell does not depend on its own consistency -- unlike Coq and Agda, Haskell relies on the consistency of a coercion language, which is not threatened by * :: *

Антон
17.06.2018
16:39:01

Vladimir
17.06.2018
16:39:14
Это всё очень сложные вопросы. Можно вопрос поглупее и попроще? Какими значениями населён в этих-ваших идрисах и агдах тип 7? Или 5? Или 92?

Yuriy
17.06.2018
16:39:56

Антон
17.06.2018
16:40:43


A64m
17.06.2018
16:41:17
рано читать перестали
> the type safety of Haskell does not depend on its own consistency -- unlike Coq and Agda, Haskell relies on the consistency of a coercion language, which is not threatened by * :: *
короче, вложенными универсумами в хаскеле по памяти не проедешь

Alexander
17.06.2018
16:47:18
меня печалит gtk