
Index
25.07.2018
09:11:30
сделать, перегрузкой по типам

A64m
25.07.2018
09:11:35
как и вообще дататайп-дженериков
это не рекорды
весь смысл рекордов в перегрузке "по строчкам"

Google

Index
25.07.2018
09:12:43
чем
data Rec = MyRec { a :: Int, b :: Int }
хуже, чем
newtype A = A Int
newtype B = B Int
type Rec = { A, B }
или
label A
label B
type Rec = { A :: Int, B :: Int }

A64m
25.07.2018
09:13:42
тем что требует деклараций
нормальный рекорд вообще не должен никаких деклараций требовать

Index
25.07.2018
09:14:31
ну так в этом и смысл, что декларация определяет сущность, а не выбор имени, который должен быть нерелевантным вообще, потому что имена это мета
альфа-эквивалентность и всё такое

A64m
25.07.2018
09:16:20
да понятно в чем смысл, для рекордов это неудобно

Index
25.07.2018
09:18:11
когда начинают имена и сущности путать, у меня от этого так горит, это такая бессовестная подмена понятий
я не знаю как можно с серьезным лицом это толкать
формализовывать
и т.д.
так же как математики, которые помешаются там на какой-то конкретной системе счисления и начинают доказывать свойства про "суммы цифр" и т.д., как будто цифры это что-то релевантное, а не способ записи

Google

Pineapple
25.07.2018
09:19:58
Всякая нотация, чтобы ей было удобно пользоваться должна быть компактной. Если для каждого поля в структуре генерить newtype — это будет километры бойлерплейта
data V3 a = V3 { x :: a, y :: a, z :: a } ?

Index
25.07.2018
09:20:48
меня не волнует нотация
пусть будут всякие DuplicateRecordFields например, и т.д.
меня начинает беспокоить, когда нотация из синтаксиса переползает в семантику, то есть начинает абстракция по этим штукам

Pineapple
25.07.2018
09:20:55
Три ньютайпа разводить?

Index
25.07.2018
09:21:20
конечно

Pineapple
25.07.2018
09:21:31

Index
25.07.2018
09:21:53
я имею в виду, что пусть нотация будет с любыми уродствами
и путаньем сущности и имени
всё ради компактности
а вот теоретическая чистота самих сущностей, описываемых нотацией, для меня важна
то есть строчки, которые для меня всегда жили в мете, в нотации, начинают переползать в семантику — угххх

A64m
25.07.2018
09:22:47

Index
25.07.2018
09:24:27
ну я начал писать на Haskell не из-за компактности, с любой вербозностью жить можно, если семантика правильная
то есть понятно, что не с любой, но не то чтобы если в Haskell синтаксис стал а-ля Java, то для меня бы это стало катастрофой (не стало бы)

Kaidax
25.07.2018
09:25:28

A64m
25.07.2018
09:26:52
т.е. я считаю позицию @int_index пр ряду вопросов правильной и полезной, но не по тому что можно увидеть глазами
все предложения по тому, что можно увидеть глазами - заставляют мои глаза кровоточить

Leonid
25.07.2018
09:29:52
@int_index против хаскеля в продакшоне, так и запишем

Alexander
25.07.2018
09:30:35

Kaidax
25.07.2018
09:32:05

Google

Kaidax
25.07.2018
09:32:15
Меньше бойлерплейта - больше пишут логов

Alexander
25.07.2018
09:32:42
зачастую в структурированных логах (для меня) интересен стек атрибутов
т.к. в сообщении об ошибке зачастую не появляются аргументы, которые прицепили к нашему стеку ранее, и которые потом должны появиться в логе

Kaidax
25.07.2018
09:33:39
Контекст тоже тащится если ты об этом

Alexander
25.07.2018
09:34:00
это добавление одного TH метода.
к существующему решению, который часть surface синтаксиса
а самое интересное со структурированными логами в другом (имхо)
причем TH или аналога, чтобы не было runtime cost

Kaidax
25.07.2018
09:36:40

Index
25.07.2018
09:39:24
в рефлекшене тоже есть функциональная зависимость, что если Reifies s a, то s -> a, так что тайп инференс там не страдает
а вот Proxy да, плохо, и еще без first-class existentials местами плохо
но выдиранием прокси занимаются as we speak

Index
25.07.2018
09:40:32
несколько пропозалов в этом направлении, пейпер недавно еще

Alexander
25.07.2018
09:40:46
я на самом деле плохо вижу почему там нужен type inference при написании логов, и так же (я не вижу почему из TH у нас не будет доступа к информации о переменной, т.к. она объявлена в другом блоке)

Kaidax
25.07.2018
09:40:56
Например эмулировать ооп синтаксис:
mkObj :: (Object a) => a -> (forall a'. (?curObj :: a', Object a') => r) -> r
mkObj a f = let ?curObj = a in f
class Object a where
get :: (?curObj :: a) => IO Int
x = do
let obj = mkObj
a <- obj get
b <- obj get
pure (a + b)

Alexander
25.07.2018
09:41:02
но может я неправильно помню про ТН, не часто этой фичпй пользуюсь

Kaidax
25.07.2018
09:41:52

Index
25.07.2018
09:44:17
Да. А как ты еще будешь @s определять, если у тебя ее ни в типе нет, ни явно?

Kaidax
25.07.2018
09:47:54
Очевидно. Просто я говорю о том что имплициты подаются по имени, поэтому вместо того чтобы подать @s чтобы прорезолвить оверлоад, можно наоборот выхватывать тип из имлпицита и делать оверлоад только по нему. То есть делать полностью контекстно-зависимые DSL'ки.

Index
25.07.2018
09:49:12
так s соответствует имени, а не типу

Google

Index
25.07.2018
09:49:31
то есть ?curObj :: a это что-то вроде Reifies "curObj" a
s надо протаскивать вручную или выводить, потому что она локальная, а "curObj" это не переменная, а просто строчка
тут две проблемы. первое в том, что это строчка, про это я уже жаловался и сегодня больше не хочу, допустим мы заменим это на data CurObj и Reifies CurObj
получается что-то вроде Given-style reflection уже, то есть протаскивать s не нужно, но есть угроза когерентности

Kaidax
25.07.2018
09:51:15
Да, но я могу написать obj get, а не obj (\(p :: Proxy s) -> get @s) where get :: forall s a. (Reifies s a, Object a) => IO Int; get = reflect (Proxy @s) & get

Index
25.07.2018
09:53:10
для Given-style reflection мне хотелось бы хорошую историю увидеть, то есть понятно, что
give True (give False (expr))
это нонсенс, но вот
give True expr && give False expr
это ок,
то есть надо как-то формализовать locally coherent, чего я не видел для Хаскеля

Kaidax
25.07.2018
09:53:59
К тому же я могу оверлодать полностью, e.g.:
class Object a r | a -> r where
get :: (?curObj :: a) -> r
data IntObj = IntObj
data StringObj = StringObj
instance Object IntObj (IO Int)
instance Object StringObj (IO String)
mkStringObj :: _; mkIntObj :: _;
x = do
a :: Int <- mkIntObj get
b :: String <- mkStringObj get


Index
25.07.2018
09:55:51
я еще раз говорю, с implicit parameters две проблемы, — они основаны на строчках и они могут когерентность ломать
про строчки — это можно исправить и ни один из примеров выше не сломается
про когерентность — это присуще и Given-style reflection и обходится исключительно аккуратностью
имплиситные параметры можно выкинуть если решить проблему про когерентность, тогда любой адекватный пример смог бы переписать на reflection
на сейчасшний момент не могу
то есть я верю, что имплиситные параметры можно хорошо применить, но мне от этого проще не становится
то есть ты пойди, возьми Refies, и убери там весь rank2 происходящий
просто в reify вынести forall s наверх

Admin
ERROR: S client not available

Kaidax
25.07.2018
09:59:16
Но ведь в этом не будет смысла?

Index
25.07.2018
09:59:26
в этом будут имплиситные параметры

Kaidax
25.07.2018
09:59:26
forall s создает синглтон

Index
25.07.2018
09:59:43
все примеры выше переписываются тогда на Reifies CurObj a вместо ?curObj :: a
потому что имплиситные параметры это и есть reflection, в котором s в refiy вытащили наверх
и приняли за него строчку

Kaidax
25.07.2018
10:00:39
Ну в целом да.
Это кстати хорошая идея так сделать, потому что тогда "строчку" можно вычислять через TypeFamily что мне сейчас понадобилось
Спасибо за идею!

Google

Index
25.07.2018
10:06:40
пожалуйста
(я пять минут думал что сказать про вычисление строчек для имплицитных параметров посредством семей типов, но не придумал)

Ilya
25.07.2018
10:07:39

Index
25.07.2018
10:11:57
да я видел как real numbers определяют как последовательность десятичных цифр
а потом задают equivalence class на этом
чтобы 0.9999... и 1.0 приравнять

Ilya
25.07.2018
10:13:42

Index
25.07.2018
10:13:58
приятно слышать

Евгений
25.07.2018
10:18:45
Это никогда не существовавшая традиция. В фихтенгольце (50'ые годы) вещественные определяются как дедекиндовы сечения. В крайном случае их конструируют как сходящиеся в себе последовательности

Kaidax
25.07.2018
10:19:56

Pineapple
25.07.2018
10:20:12
На физтехе, как помню дейтсвительные числа вводили именно через десятичные разложения. Но я нетвердо помню

Евгений
25.07.2018
10:20:31
В защиту выделенных систем счисления могу сказать, что p-адические числа напрямую от системы счисления зависят

Ilya
25.07.2018
10:20:50

A64m
25.07.2018
10:31:26
ну конечно, пара человек тут ответили, что TLC вроде нормальная фича, но пропозал не минусанули

Alexander
25.07.2018
10:32:18
у нас через пределы в школе вводили

Pineapple
25.07.2018
10:39:57
Хорошая школа

Евгений
25.07.2018
10:40:42
Ты в 239 учился?

Alexander
25.07.2018
10:40:59
в АГ

Евгений
25.07.2018
10:41:12
Норм, до исхода ЮМШ или после?

Alexander
25.07.2018
10:41:54
не знаю

Евгений
25.07.2018
10:42:17
А ты в каком закончил?

Alexander
25.07.2018
10:42:32
2003 вроде или 2004