@haskellru

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

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
https://github.com/ghc/ghc/commit/60e4bb4d305bc1a65457ee79b1e69c11b9ed747d
теперь константы будут вычисляться совершенно бесплатно?

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 это будет выглядеть?

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

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

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

Yuriy
17.06.2018
10:39:42
ну у него был конкретный вопрос: "как без do?"
это @Masteroid упомянул без-ду-шную нотацию, я считаю, зря

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
main = f (<- a) (<- b) (<- c)
вроде в той версии что обсуждалась надо do писать т.е ``` main = do f (<- a) (<- b) (<- c) ```

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
вроде в той версии что обсуждалась надо do писать т.е ``` main = do f (<- a) (<- b) (<- c) ```
ну это не страшно и вполне логично, я просто забыл

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
@kana_sama зацени https://stackoverflow.com/questions/49628762/lifting-generalization
ага, писал такое тоже, но пользовать таким нереально, ошибкие тоже непонятные, выводится иногда не то и тд

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
game ^. boss . health
это же стейт

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
run отдает и стейт, и результат вычисления в монаде exec отдает только стейт в монаде (когда результат вычисления не важен)
Функции IO () работать в exec не будут? Почему-то у меня они все глохнут при вызове execStateT

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
Может, resultStateT voidStateT были бы понятнее?
run/exec/eval - глаголы. result и void - не то глаголы, не то странные существительные :)

Imants
17.06.2018
14:15:39
run/exec/eval - глаголы. result и void - не то глаголы, не то странные существительные :)
Разве лингвистика важнее значения/смысла? Конечно, run, exec уже в либе. Да и документацию поднять нетрудно.

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

Aleksey
17.06.2018
14:56:06
Разве лингвистика важнее значения/смысла? Конечно, run, exec уже в либе. Да и документацию поднять нетрудно.
run у всех монадок. Вот exec/eval можно было назвать иначе. Но логика есть и в текущем именовании - exec делается ради эффекта, а eval ради вычисления значения

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

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

можно считать что все виновные установлены, Тернер и Милнер не при чем

бокс, кстати, не имеет отношение ко всяким боксед-лифтед, это просто квадратик из Барендрегтовского пейпера словом

Антон
17.06.2018
16:32:59
раньше было 0 :: Int :: * :: BOX терм тип кайнд сорт теперь 0 :: Int :: Type :: Type :: Type :: Type терм и типы ол зе вей даун
А почему не стали делать, как в Idris — Type : Type 1 : Type 2: ...? А то меня самовложенность универсума напрягает

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
ух ты, ещё вот так можно λ> instance Num () where fromInteger _ = () λ> 2 == 3 True
Не плоди сиротских инстансов, бессердечный!

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

Yuriy
17.06.2018
16:39:56
Не плоди сиротских инстансов, бессердечный!
это грязный хак. очень грязный

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

Страница 1276 из 1551