@haskellru

Страница 329 из 1551
kir
19.07.2017
19:40:30
угу. И не пользоваться чужими библиотеками. И общей рекурсией

Index
19.07.2017
19:41:20
Так это ж жизнь хаскелиста, законы доказываем на бумажке, а termination checking на авось.

Только в итоге вроде и норм выходит.

Вот dependent Haskell как раз интереснее, чем от боттомов огораживаться.

Google
Vasiliy
19.07.2017
19:42:16
> Просто не уходить в бесконечную рекурсию тут есть проблема - чтоб выяснить, конечна ли рекурсия, в неё надо уйти

Index
19.07.2017
19:43:15
Ну т.е. берешь ты теорию категорий могучую, начинаешь что-то там про Haskell-код рассуждать, и ломается у тебя это на первом же bottom

kir
19.07.2017
19:43:24
+1

Index
19.07.2017
19:43:26
Но, казалось бы, и ничего страшного, ведь bottom и должен все ломать

И живешь дальше, и все хорошо

Меня больше волнует, что в Haskell нет релевантной квантификации, из-за чего нельзя naturality выражать и приходится ее аппроксимировать через parametricity.

И какой-нибудь там type f ~> g = forall a . f a -> g a из-за этого не позволяет выразить любые натруальные трансформации.

kir
19.07.2017
19:57:47
Что за naturality?

fmap f . trans == trans . fmap f, где trans :: g ~> h?

Index
19.07.2017
20:01:18
Да. Оно следует из parametricity, но не наоборот

Например, у нас в Haskell есть fmap :: forall f a b . Functor f => (a -> b) -> (f a -> f b). Но т.к. a и b введены через forall (имеем parametricity), то из первого закона fmap id = id следует и второй закон fmap (f . g) = fmap f . fmap g.

В теории категорий один закон из другого не следует, поэтому их два.

Т.к. там не parametricity используется, когда говорят "for every object exists ..."

Google
kir
19.07.2017
20:03:51
Так. У хаскелля есть параметричность, из которой следует натуральность. Не означает ли это, что у хаскелля есть так же и натуральность?

Index
19.07.2017
20:04:26
Ага, и она везде, где параметричность

Но ее нет самой по себе, поэтому мы не можем выражать вещи, которые натуральны, но не параметричны

Точнее, можем, но на case-by-case основе, добавлением всяких там констрейнтов

kir
19.07.2017
20:06:12
Например?

Index
19.07.2017
20:07:28
Кметт такую ссылку с подробностями предлагает

https://twitter.com/kmett/status/736182981145026561

но я не осилил

Я только общую постановку проблемы понял пока что.

kir
19.07.2017
20:10:57
То бишь, он утверждает, что есть в Hask вещи параметричные, но ненатуральные?

Index
19.07.2017
20:11:23
Такого не бывает

kir
19.07.2017
20:11:28
А, наоборрт

Index
19.07.2017
20:11:28
parametricity implies naturality

Он утверджает, что в Хаскеле неудобно теорию категорий моделировать, потому что там где в теоркатегорном языке говорят "for every" нельзя в Хаскельной версии просто воткнуть "forall".

И кидает ссылку, которая рассказывает о разнице формально.

kir
19.07.2017
20:13:00
Это уже совсем тонкие темы пошли. Надо читать.

Index
19.07.2017
20:14:12
Но суть в том, что если взять relevant квантификацию, т.е. pi из DependentHaskell вместо forall, то будет норм. Потому что pi не требует ни параметричности, ни натуральности

И натуральные трансформации можно будет выразить таким образом примерно: type f ~> g = pi a. f a -> g a Только он "больше", чем натуральные трансформации, т.к. не требует натуральности. Надо еще в комменте закон написать будет.

kir
19.07.2017
20:17:23
А чем вообще pi отличается от forall?

Index
19.07.2017
20:17:24
(Или не в комменте, если Agda)

Google
kir
19.07.2017
20:18:04
Если Agda - то в глубоком юникоде.

Index
19.07.2017
20:18:37
по переменным, введенным через forall, паттерн-матчить нельзя. Вот если ты на Agda пишешь, то у тебя есть параметричность, если кайнд Set, и ее нет, если любой другой кайнд.

А в Dependent Haskell это квантификатором регулируется

kir
19.07.2017
20:19:26
А, то бишь, совсем deptypes

Паттерн-матчить в type-expr или в теле объявления?

Index
19.07.2017
20:20:27
т.е. такое невозможно id :: forall a. a -> a id x = case a of String -> "ha ha" _ -> x а с pi вместо forall возможно

в type-expr можно всегда через type families

речь про тело объявления

kir
19.07.2017
20:21:23
А в Агде, вроде, можно

Index
19.07.2017
20:21:49
в Агде можно, если введенная переменная не в Set

т.е. если ты натуральное число примешь, то можно, конечно

а если тип какой-то населенный, то нельзя

Index
19.07.2017
20:22:39
Но это странно, что от типа зависит параметричность

И McBride про это выступал и жаловался много, так что в DependentHaskell решили сделать "как надо".

kir
19.07.2017
20:23:17
А, то есть пример выше тоже не будет компилироваться?

Index
19.07.2017
20:23:34
Ага, такой хитрый id в Agda написать нельзя

потому что нельзя будет матчить по типу

kir
19.07.2017
20:25:17
Я понимаю, почему возможность так делать отобрали

Index
19.07.2017
20:26:13
Ее отобрали в т.ч. потому что Set особенный тем, что открытый

Ты можешь новые объявления делать и у него будут добавляться новые конструкторы

Google
Index
19.07.2017
20:26:47
И подогнать под это нормальную теорию для паттерн-матчинга весьма нетривиально

kir
19.07.2017
20:27:14
Такие id обладают недоступной снаружи структурой и вообще. Как теоретики смотрят на то, что с pi у нас более чем бесконечное кол-во функций вида pi a . a -> a?

А Set1 тоже нельзя матчить?

Index
19.07.2017
20:28:08
Ну так рассмотри что-то вроде f :: pi (n :: Nat). forall (a :: Type). Vec n a -> Vec n a

Тебя же не смущает, что ты не параметричен по n :: Nat

И в зависимости от длины эта f может совершенно разные вещи делать

Admin
ERROR: S client not available

Index
19.07.2017
20:28:57
Например, для n как простых чисел делать reverse, а для остальных делать id

А Set1 тоже нельзя матчить?
Да, никакой Set lvl нельзя

Aleksey
20.07.2017
04:16:09
>>> False == False in [False] True
Это ещё пол-беды! Вот где "интересное": >>> (False == False) in [False] False >>> False == (False in [False]) False

Alexander
20.07.2017
05:26:47
>>> False == False in [False] True
https://docs.python.org/3/reference/expressions.html#comparisons Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be false).

там получается (False == False) and (False in [False])

Aleksey
20.07.2017
05:28:05
>>> dis.dis(lambda: False == False in [False]) 1 0 LOAD_CONST 1 (False) 2 LOAD_CONST 1 (False) 4 DUP_TOP 6 ROT_THREE 8 COMPARE_OP 2 (==) 10 JUMP_IF_FALSE_OR_POP 18 12 LOAD_CONST 2 ((False,)) 14 COMPARE_OP 6 (in) 16 RETURN_VALUE >> 18 ROT_TWO 20 POP_TOP 22 RETURN_VALUE >>> dis.dis(lambda: (False == False) in [False]) 1 0 LOAD_CONST 1 (False) 2 LOAD_CONST 1 (False) 4 COMPARE_OP 2 (==) 6 LOAD_CONST 2 ((False,)) 8 COMPARE_OP 6 (in) 10 RETURN_VALUE >>> dis.dis(lambda: False == (False in [False])) 1 0 LOAD_CONST 1 (False) 2 LOAD_CONST 1 (False) 4 LOAD_CONST 2 ((False,)) 6 COMPARE_OP 6 (in) 8 COMPARE_OP 2 (==) 10 RETURN_VALUE

False == False iff False in [False]

Понятно, что сцепочили сравнение, непонятно, почему in, тоже "сравнение"

Alexander
20.07.2017
05:32:21
а вот фиг знает, но я ради интереса сейчас спрошу в IRC'е Python'истов) интересно, что ответят

Aleksey
20.07.2017
05:32:34
Гвидо странный, поэтому такое

В той же доке >>> nan = float('NaN') >>> nan is nan True >>> nan == nan False <-- the defined non-reflexive behavior of NaN >>> [nan] == [nan] True <-- list enforces reflexivity and tests identity first

Так что всё плохо со здравым смыслом

И даже понятно, почему так сделали - is быстрее, чем == - но в целом то адище получается!

Google
kir
20.07.2017
05:35:08
Да что про Гвидо говорить, он в районе 2007 хотел выпилить map, filter и reduce и заменить их на циклы и свой ужасный list comprehension.

Из него же: "И я их добавил, только потому что они были нужны 1 лисп-хакеру, который прислал работающие патчи"

Насчёт map(f, y) возвращающего объект, из которого при чтении удаляются элементы не хейтили ещё?

Aleksey
20.07.2017
05:49:35
Гвидо - известный ФП-ниосилятор :)

>>> i = map((1).__add__, [1,2,3]) >>> list(i) [2, 3, 4] >>> list(i) []

"раньше такого не было"

kir
20.07.2017
06:12:05
У меня полчаса бомбило, когда я это выяснил.

kana
20.07.2017
20:14:59
Интересно, что назначение монад я ещё более менее понимаю, а вот про аппликаторы не понимаю ничего. Нет, я знаю их интерфейс, я знаю, где они применяются, но совсем не понимаю концепции

Denis
20.07.2017
20:16:15
Интересно, что назначение монад я ещё более менее понимаю, а вот про аппликаторы не понимаю ничего. Нет, я знаю их интерфейс, я знаю, где они применяются, но совсем не понимаю концепции
ну как бы когда ты юзаешь аппликативы то ты получаешь эффекты заложеные в структуру данных (а в монадках ты можешь управлять всем этим)

kana
20.07.2017
20:18:24
Какие эффекты? Как оборачивание чистой функции в аппликатор и вызов этой функции с аргументом, который находиться внутри другого аппликатора, дает нам доступ к каким-то эффектам

Vasiliy
20.07.2017
20:18:59
оборачивание чистой функции ничего не даст

pure не добавляет никакой информации

kana
20.07.2017
20:21:07
Я пока не очень понимаю, как работает IO. Пока что у меня это выглядит каким-то большим сум-типом со списком команд. И каждый раз, когда значение IO доходит до уровня выполнения, Хаскель выполняет команду, а потом вызывает колбеки

И это как-то очень костыльно все

Anatolii
20.07.2017
20:21:31
Мне кажется что до меня дошло после доклада Simon Marlow про haxl и зачем они applicative do запилили

Vasiliy
20.07.2017
20:22:14
всё так, выполняет команду, вызывает колбэки

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