Vladislav
ну я начал писать на Haskell не из-за компактности, с любой вербозностью жить можно, если семантика правильная
Vladislav
то есть понятно, что не с любой, но не то чтобы если в Haskell синтаксис стал а-ля Java, то для меня бы это стало катастрофой (не стало бы)
A64m
т.е. я считаю позицию @int_index пр ряду вопросов правильной и полезной, но не по тому что можно увидеть глазами
все предложения по тому, что можно увидеть глазами - заставляют мои глаза кровоточить
Leonid 🦇
@int_index против хаскеля в продакшоне, так и запишем
Alexander
Kai
Kai
Меньше бойлерплейта - больше пишут логов
Alexander
зачастую в структурированных логах (для меня) интересен стек атрибутов
Alexander
т.к. в сообщении об ошибке зачастую не появляются аргументы, которые прицепили к нашему стеку ранее, и которые потом должны появиться в логе
Kai
Контекст тоже тащится если ты об этом
Alexander
Alexander
это добавление одного TH метода.
Alexander
к существующему решению, который часть surface синтаксиса
Alexander
а самое интересное со структурированными логами в другом (имхо)
Alexander
причем TH или аналога, чтобы не было runtime cost
Vladislav
в рефлекшене тоже есть функциональная зависимость, что если Reifies s a, то s -> a, так что тайп инференс там не страдает
а вот Proxy да, плохо, и еще без first-class existentials местами плохо
Vladislav
но выдиранием прокси занимаются as we speak
Vladislav
несколько пропозалов в этом направлении, пейпер недавно еще
Alexander
я на самом деле плохо вижу почему там нужен type inference при написании логов, и так же (я не вижу почему из TH у нас не будет доступа к информации о переменной, т.к. она объявлена в другом блоке)
Kai
Например эмулировать ооп синтаксис:
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
но может я неправильно помню про ТН, не часто этой фичпй пользуюсь
Kai
Vladislav
Да. А как ты еще будешь @s определять, если у тебя ее ни в типе нет, ни явно?
Kai
Очевидно. Просто я говорю о том что имплициты подаются по имени, поэтому вместо того чтобы подать @s чтобы прорезолвить оверлоад, можно наоборот выхватывать тип из имлпицита и делать оверлоад только по нему. То есть делать полностью контекстно-зависимые DSL'ки.
Vladislav
так s соответствует имени, а не типу
Vladislav
то есть ?curObj :: a это что-то вроде Reifies "curObj" a
Vladislav
s надо протаскивать вручную или выводить, потому что она локальная, а "curObj" это не переменная, а просто строчка
тут две проблемы. первое в том, что это строчка, про это я уже жаловался и сегодня больше не хочу, допустим мы заменим это на data CurObj и Reifies CurObj
получается что-то вроде Given-style reflection уже, то есть протаскивать s не нужно, но есть угроза когерентности
Kai
Да, но я могу написать 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
Vladislav
для Given-style reflection мне хотелось бы хорошую историю увидеть, то есть понятно, что
give True (give False (expr))
это нонсенс, но вот
give True expr && give False expr
это ок,
то есть надо как-то формализовать locally coherent, чего я не видел для Хаскеля
Kai
К тому же я могу оверлодать полностью, 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
Vladislav
я еще раз говорю, с implicit parameters две проблемы, — они основаны на строчках и они могут когерентность ломать
про строчки — это можно исправить и ни один из примеров выше не сломается
про когерентность — это присуще и Given-style reflection и обходится исключительно аккуратностью
Vladislav
имплиситные параметры можно выкинуть если решить проблему про когерентность, тогда любой адекватный пример смог бы переписать на reflection
на сейчасшний момент не могу
Vladislav
то есть я верю, что имплиситные параметры можно хорошо применить, но мне от этого проще не становится
Vladislav
то есть ты пойди, возьми Refies, и убери там весь rank2 происходящий
Vladislav
просто в reify вынести forall s наверх
Kai
Но ведь в этом не будет смысла?
Vladislav
в этом будут имплиситные параметры
Kai
forall s создает синглтон
Vladislav
все примеры выше переписываются тогда на Reifies CurObj a вместо ?curObj :: a
Vladislav
потому что имплиситные параметры это и есть reflection, в котором s в refiy вытащили наверх
Vladislav
и приняли за него строчку
Kai
Ну в целом да.
Kai
Это кстати хорошая идея так сделать, потому что тогда "строчку" можно вычислять через TypeFamily что мне сейчас понадобилось
Kai
Спасибо за идею!
Vladislav
пожалуйста
(я пять минут думал что сказать про вычисление строчек для имплицитных параметров посредством семей типов, но не придумал)
Ilya
Vladislav
да я видел как real numbers определяют как последовательность десятичных цифр
Vladislav
а потом задают equivalence class на этом
Vladislav
чтобы 0.9999... и 1.0 приравнять
Ilya
Vladislav
приятно слышать
Евгений
Это никогда не существовавшая традиция. В фихтенгольце (50'ые годы) вещественные определяются как дедекиндовы сечения. В крайном случае их конструируют как сходящиеся в себе последовательности
Kai
Алексей
На физтехе, как помню дейтсвительные числа вводили именно через десятичные разложения. Но я нетвердо помню
Евгений
В защиту выделенных систем счисления могу сказать, что p-адические числа напрямую от системы счисления зависят
Евгений
Ilya
A64m
ну конечно, пара человек тут ответили, что TLC вроде нормальная фича, но пропозал не минусанули
Alexander
у нас через пределы в школе вводили
Алексей
Хорошая школа
Евгений
Евгений
Ты в 239 учился?
Alexander
в АГ
Евгений
Норм, до исхода ЮМШ или после?
Alexander
не знаю
Евгений
А ты в каком закончил?
Alexander
2003 вроде или 2004
Alexander
2004
Евгений
ЮМШ убежало летом с 2003'ого по 2004'ый
Alexander
я как-то не связан с ЮМШ был никак
Andrey
вроде действительные вводятся аксиоматически через нерациональность корня из 2 и пределы, да. а по поводу позиционно-разрядной системы счисления - не Кантор ли в своих лестницах ее вовсю в доказательствах применял?
Евгений
Ну они просто математику в АГ преподавали до 2005'ого
Alexander
у нас преподы с матмеха и алгебру с ПМ вроде
Евгений
Мне нравится Eudoxus reals из извращений
Alexander
я не воспроизведу, если тетрадку не почитаю