
Dmitry
07.08.2018
13:59:21
Надо думать

Ilya
07.08.2018
14:00:08

Dmitry
07.08.2018
14:00:55
Наверное, надо доказать (от противного), что такая конструкция не возможна

Александр
07.08.2018
14:01:03
Кстати, такой вариант, судя по всему, тоже должен ломаться: (g x, g x) (просто пара значений этой особенной функции)

Google

Dmitry
07.08.2018
14:01:09
Кто уже прочёл TAPL и сможет?
Ну вот как-то так: пусть такая конструкция возможна и f=...g...g... не компилируется. Тогда рассмотрим const id f, в ней второй аргумент не используется, вроде, должен отбрасываться. То есть, скомпилируется. Примерно так...

Denis
07.08.2018
14:09:28

Александр
07.08.2018
14:10:36
Я не очень понимаю, но кажется, ленивость не должна тут влиять

The mirror
07.08.2018
14:11:31

Александр
07.08.2018
14:12:58
Вот было бы круто, если бы такое расширение было в GHC. Можно было бы создавать функции вроде
resource <- aquireResource resourceDef
и
closeResource resource
и не бояться, что какая-то из функций вызовется дважды.
Но это описание уж очень смахивает на то, что @qnikst про линейные типы рассказывал

Denis
07.08.2018
14:14:17

Alexander
07.08.2018
14:15:18
линейные типы такого прям не дадут
давай разбираться
пусть у нас будет магическая функция foo
foo 1 можно в двух местах проекта написать?
это осмысленно?
можно ли написать foo (op a b)

Google

Alexander
07.08.2018
14:16:34
но видимо функции пофиг на значение, ей только тип важен?
вообще ничего не мешает функцию заделать идемпотентной

Denis
07.08.2018
14:17:03
если только тип, то как-то через прокси

Dmitry
07.08.2018
14:17:06
Не, погодите-ка. Это компилятору, получается, надо обнаружить одинаковые вычисления. А это - заявка на решение проблемы останова. Так что не получится

Alexander
07.08.2018
14:17:14
хранить set типов на которых вызвано, и mvar
при вызове проверять вызывалась ли, и если да то noop
дёшево и сердито

Dmitry
07.08.2018
14:17:35
Это в рантайме

Alexander
07.08.2018
14:17:59
тут нету вычислений, не важно ж значение (наверное)
нас попросили один раз для типа

Александр
07.08.2018
14:18:32
Значение, в общем случае, не важно, да

Dmitry
07.08.2018
14:18:55
А компилятор энергично типы проверяет? Можно на типах сэмулировать ленивость?

Alexander
07.08.2018
14:19:06
нет
то, что глобально у нас в одном экземпляре это инстансы

Александр
07.08.2018
14:19:40

Alexander
07.08.2018
14:20:07
т.е. если есть какая типофамилия сопоставляющая скажем Int и тип, то можно сделать что она будет объявлена один раз
для каждого типа, поможет ли это хз

Denis
07.08.2018
14:20:27
что если иметь HSet + HList c типами, что были вызваны? ну проверять есть ли такие типы в коллекции или нет

Александр
07.08.2018
14:20:33

Alexander
07.08.2018
14:21:01
вообще какое-то желание поднять линейные типы на уровень выше

Google

Denis
07.08.2018
14:21:25

Alexander
07.08.2018
14:21:33
ага, которых нету уже
насколько я знаю теории в этом направлении нету
но вообще на XY похоже

Denis
07.08.2018
14:22:07

Alexander
07.08.2018
14:22:14
все тип

Александр
07.08.2018
14:22:34
Это еще 8 лет будет продолжаться, все норм :)
Или я путаю?

Yuriy
07.08.2018
14:22:39
я не понимаю математический смысл этого. ведь f x ... f x ≡ y ... y where y = f x. то есть эти ситуации неотличимы

Denis
07.08.2018
14:22:47
все тип
хм, но поднимать все равно надо через плагины или синглтоны?

Dmitry
07.08.2018
14:23:09
Ну если бы была ленивость на типах, мы могли бы сделать что-то типа Const a b, где b лениво тайпчекался. Тогда туда можно было бы запихать f=....g....g..., то есть в таком лениво тайпчекере можно было бы обойти ограничение на единичность.

Александр
07.08.2018
14:24:29
Значит ли это, что есть некая семантика, которая невыразима в системе типов?

Yuriy
07.08.2018
14:24:35
наверно, можно через TH в компайлтайме (рантайме TH) записывать каждый тип в глобальную переменную

Denis
07.08.2018
14:24:40
ну еще можно идексировать типы, и чтобы не совпадали индексы при вызове

Yuriy
07.08.2018
14:24:54

Denis
07.08.2018
14:25:40
индексация временем :D тогда точно никогда не совпадет

Александр
07.08.2018
14:25:53
Хе-хе

Yuriy
07.08.2018
14:27:24

Denis
07.08.2018
14:27:28

Google

Denis
07.08.2018
14:27:59
и потом сравнивать только аннотации

Александр
07.08.2018
14:29:23
Все, здесь я уже перестал что-либо понимать. ?
То есть, вы говорите, что задача некорректна?

Yuriy
07.08.2018
14:30:53

Denis
07.08.2018
14:31:57
a monadplus is just a near-semiring in the category of endofunctors
what the problem?

Yuriy
07.08.2018
14:32:09

Александр
07.08.2018
14:32:28
Prove it!

Denis
07.08.2018
14:32:48
ну как бы всегда можно пойти от обратного)
а потом чтд или не чтд

Yuriy
07.08.2018
14:34:19
Prove it!
я выше писал, что в семантике Хаскеля f x + f x и y + y where y = f x эквивалентны. следовательно, ты можешь решить свою задачу в рамках AST, но не в рамках Хаскеля

Александр
07.08.2018
14:35:32
Ну ладно.
Хотя, может, тут новый синтаксис можно было бы ввести

Admin
ERROR: S client not available

Yuriy
07.08.2018
14:36:02

Dmitry
07.08.2018
14:41:29

Yuriy
07.08.2018
14:47:06

Alexander
07.08.2018
14:53:13
а можно узнать саму задачу-то?

Александр
07.08.2018
14:57:15

Alexander
07.08.2018
15:05:13
это максимум ката какая-то из разряда because I can
это может быть решением какой-то задачи, но не самой задачей

Google

kana
07.08.2018
15:06:58

Alexander
07.08.2018
15:08:37
это не решит проблему

kana
07.08.2018
15:09:30
это не решит проблему
Почему? Это не даст нам вызвать функцию дважы и даст возможность менять тип аргумента (инкрементить нат в фантоме там)

Alexander
07.08.2018
15:10:02
а то, что вернул я ещё раз с аргументос того же типа вызову
Foo xs = Foo (forall a. a NotIn xs => a -> Foo (a:xs)) и такую штуку линейно еще
тогда взлетит

kana
07.08.2018
15:13:04
newtype F (n :: Nat)
= F { runF :: Proxy n -> Int -> (F (S n), String) }
и вот в скоуп, где нужна эта функция, передать линейно F Z

Alexander
07.08.2018
15:14:34
ну здесь только один домен для типов
так не интересно
то, что выше это в общем-то тоже самое
м нужны линейные типы чтобы запустить

IC
07.08.2018
15:30:43
я правильно понял, что tasty не умеет свои группы параллельно гонять, а tasty-hedgehog заворачивает только отдельные кейсы, но не [параллельные] группы?

Yuriy
07.08.2018
15:58:56

IC
07.08.2018
16:00:13
почему странно? деревья там только для группировки

Yuriy
07.08.2018
16:01:58

IC
07.08.2018
16:06:21
Features:
* Run tests in parallel but report results in a deterministic order
хех.. первым же пунктом.

Hot
08.08.2018
07:38:28
Что почитать по Haskell, если самые азы как-то осилил, но того, о чём в это чате пишут, до сих пор не понимаю?

Imants
08.08.2018
07:40:36
я тоже мало чего понимаю. Это норм. ☺️

sherzod
08.08.2018
07:41:11
Бездонный язык

Hot
08.08.2018
07:41:19
И нет желания начать понимать?

Dmitry
08.08.2018
07:41:35
Изучаю Haskell больше трех лет и тоже не все понимаю, что пишут в этом чате. Вообще, понимание этого чата не является показателем понимания языка.

Imants
08.08.2018
07:42:01