@haskellru

Страница 1293 из 1551
Aleksey
21.06.2018
07:05:06
Потому как приоритеты и фиксити кастомных операторов парсер не волнуют

А :: - это часть синтаксиса. Как скобки, например.

Какой приоритет у ( или у =? :)

Алексей Ayaye :)
21.06.2018
07:06:00
это были структуры данных транслятора - индексы во всяких таблицах. иногда инты путались и было больно. но эпик был, когда при переносе на другую платформу выяснилось, что в функции, которая возвращала тип выражения (индекс в таблице типов), был пропущен return. и всё компилировалось и работало. просто индекс по счастливой случайности вычислялся в регистре, через который потом возвращалось значение.

Google
Ilya
21.06.2018
07:07:52
Какой приоритет у ( или у =? :)
не важно, какой приоритет у =

Aleksey
21.06.2018
07:09:06
Местная аннотация типов делается ДО разбора выражений на какие-то там $ и почее.

Ilya
21.06.2018
07:09:19
скобками на = в любом случае воздействовать нельзя, а на :: можно. Раз скобки изменяют выражение, значит можно говорить о приоритете

Aleksey
21.06.2018
07:09:20
Тут нет никакого -1

Это приоритет парсинга

А не приоритет применения, который у $ равен 0

Ilya
21.06.2018
07:10:02
Местная аннотация типов делается ДО разбора выражений на какие-то там $ и почее.
ну вот тогда речь о том, что :: захватывает всё внутри скобок

Aleksey
21.06.2018
07:10:06
Зачем это (приоритеты парсера и приоритеты применения функций) смешивать вообще?

Ilya
21.06.2018
07:10:28
значит его приоритет ниже, чем у $

Aleksey
21.06.2018
07:10:57
Да блин, "жираф выше, чем крокодил длиннее"

И то и другое в метрах же!

Ilya
21.06.2018
07:15:09
Aleksey
21.06.2018
07:15:20
нет

Google
Aleksey
21.06.2018
07:15:54
Потому как полиморфизм

Ilya
21.06.2018
07:16:14
1 + 2 * 3 могут давать разные AST в зависимости от приоритета, разве нет?

Aleksey
21.06.2018
07:16:15
У парсера нет информации о приортетах ещё

Ilya
21.06.2018
07:16:58
или в корне будет стоять (+), или (*), в зависимости от

Aleksey
21.06.2018
07:17:16
Смысл будет разный. А вот будут ли разные AST - не факт

Надо спросить у гуру :)

Парсер ничего не знает о том, что такое *

Ilya
21.06.2018
07:18:06
что такое AST тогда? если у 1 + 2 * 3 он не зависит от приоритета операторов. О каком дереве мы вообще говорим тогда?

Aleksey
21.06.2018
07:18:46
AST cинтаксис Haskell описывает. А не семантику

Скобки - синтаксис. Приоритет кастомных операторов - семантика

Ilya
21.06.2018
07:19:40
ну вот тогда интересно посмотреть, в какое AST парсится 1 + 2 * 3

Aleksey
21.06.2018
07:20:02
А что здесь 1 и +?

Int, или, скажем, Hour?

Инстансы Num будут разные

А если Num вообще скрыть и перегрузить + локально?

Это сколько же проходов парсера должно быть, чтобы понять, как парсить конкретное выражение?

Нужно распарсить - и "выполнить" - импорты. Потом тайпчекнуть всё, чтобы понять типы элементов выражения. Потом найти инстансы, предоставляющие конкретные версии операторов, если тайпклассы участвуют. И только потом строить AST выражения. Так что ли?

Ilya
21.06.2018
07:23:12
не знаю, я всегда думал, что приоритет операторов влияет на итоговое AST, возможно в Haskell это действительно не так

Aleksey
21.06.2018
07:23:39
Призываются знатоки :)

Ilya
21.06.2018
07:29:14
@znatoky

Google
Ilya
21.06.2018
07:30:02
Евгений
21.06.2018
07:31:17
Надо лезть в код и понимать в какой момент infixr'ы всякие применяются. Можно эксперимент поставить (у кого компилятор под рукой) -- составить нетипизирующуюся конструкцию с двумя самописными операциями, сделать им одинаковый приоритет. Если раньше ругнётся тайпчекер, то значит AST разбирается без информации об операторах, если ругнётся на приоритет -- значит приоритет играет синтаксическую роль

Aleksey
21.06.2018
07:33:39
https://stackoverflow.com/questions/29185467/parsing-with-user-defined-operator-precedence

adam
21.06.2018
07:33:49
Надо лезть в язык и понимать в какой момент семантика зацикленных грамматик применяется. Можно эксперимент поставить (у кого словарь под рукой) -- составить нетипизирующуюся конструкцию с двумя самописными операциями, сделать им одинаковый приоритет. Если раньше ругнётся пространство, то значит прослойка разбирается без информации об операторах, если ругнётся на приоритет -- значит приоритет играет синтаксическую роль

Aleksey
21.06.2018
07:33:51
> Infix operators are parsed as if they were all left-associative. The renamer uses the fixity declarations to re-associate the syntax tree.

Так что я был и прав, и лев: парсеру пофиг на приоритеты, но AST - итоговое - будет разное :)

Александр
21.06.2018
07:39:13
Так, ребята, экзистенциальный вопрос. Функция - это структура данных?

Ilya
21.06.2018
07:40:40
$ cat foo.hs infixr 4 ## (##) :: Int -> Int -> Int (##) = undefined infixl 4 %% (%%) :: Int -> Int -> Int (%%) = undefined $ ghci foo.hs λ> 1 ## 2 %% "foo" <interactive>:1:1: error: Precedence parsing error cannot mix ‘##’ [infixr 4] and ‘%%’ [infixl 4] in the same infix expression λ> 1 ## (2 %% "foo") <interactive>:2:12: error: • Couldn't match expected type ‘Int’ with actual type ‘[Char]’ • In the second argument of ‘(%%)’, namely ‘"foo"’ In the second argument of ‘(##)’, namely ‘(2 %% "foo")’ In the expression: 1 ## (2 %% "foo")

смотри ка, @astynax, на приоритеты ругается раньше типизации

Aleksey
21.06.2018
07:42:18
Главное, что это уже после парсинга делается :)

Евгений
21.06.2018
07:42:39
Ну, судя по всему парсинг двухстадийный

Но стадии идут непрерывно

Aleksey
21.06.2018
07:46:06
> Sometimes the over-generous parsing is only dealt with by the renamer.

Vladimir
21.06.2018
07:46:48
Aleksey
21.06.2018
07:47:01
смотри ка, @astynax, на приоритеты ругается раньше типизации
Тут мономорфные функции с известной фиксити

Александр
21.06.2018
07:47:11
А морфизм - не структура данных?

Ilya
21.06.2018
07:47:34
Так, ребята, экзистенциальный вопрос. Функция - это структура данных?
ну, в питоне можно взять хэш от фунции, так что почему нет ?

Александр
21.06.2018
07:47:59
Хеш можно взять от чего угодно первоклассного

Google
Aleksey
21.06.2018
07:48:24
ну, в питоне можно взять хэш от фунции, так что почему нет ?
такое себе значение получится :) >>> hash (lambda x: x) == hash(lambda x: x) True >>> hash (lambda x: x) == hash(lambda y: y) True >>> hash (lambda x: x) == hash(lambda y: y + 1) True

Александр
21.06.2018
07:48:36
А еще от чего угодно, находящегося в памяти

Vladimir
21.06.2018
07:48:49
А морфизм - не структура данных?
смотря в какой категории

Ilya
21.06.2018
07:48:52
Алексей Ayaye :)
21.06.2018
07:49:10
а что такое структура данных?

Александр
21.06.2018
07:49:38
а что такое структура данных?
И это правильный вопрос!

Ilya
21.06.2018
07:50:11
такое себе значение получится :) >>> hash (lambda x: x) == hash(lambda x: x) True >>> hash (lambda x: x) == hash(lambda y: y) True >>> hash (lambda x: x) == hash(lambda y: y + 1) True
надо присвоить лямбды переменным. тогда разные значения пойдут. И разные даже для одинаковых лямбд

вот он, грязный язык во всей своей красе

Vladimir
21.06.2018
07:50:25
а правильный ответ - 42

Admin
ERROR: S client not available

Александр
21.06.2018
07:51:01
надо присвоить лямбды переменным. тогда разные значения пойдут. И разные даже для одинаковых лямбд
Можно положить лямбды в мапу, а ключом-хешом использовать сгенеренный guid

И даже не так. Нужно же по хешу доставать лямбду, а как его узнать? Ну пусть она везде в программе идет кортежем вместе со своим хешом

Aleksey
21.06.2018
07:53:19
Можно. Но сам факт хэшируемости функций - странный. Тем более что в питоне есть id - идентификатор объекта

Александр
21.06.2018
07:53:24
Короче, ерунда получается

Ilya
21.06.2018
07:54:03
И даже не так. Нужно же по хешу доставать лямбду, а как его узнать? Ну пусть она везде в программе идет кортежем вместе со своим хешом
я серьезно встречал в статьях по питону предложение использовать фунции как ключи словаря, поэтому и запомнилось

тоже тогда подумал, что придётся же таскать везде хэш

ну когда-то это может быть полезно, например для имитиации switch-case

Alexander
21.06.2018
08:03:45
dict[lambda x:.. : ]?

Yuriy
21.06.2018
08:10:52
ну когда-то это может быть полезно, например для имитиации switch-case
там функции как значения словаря. это совсем другое

Google
Александр
21.06.2018
08:12:43
Видимо, правильное решение было бы таким. Кладем лямбду в кортеж вместе с уникальным индексом, например, guid (или заворачиваем в другую лямбду, возвращающую guid + первую, что эквивалентно). Хеш от этого индекса и будет хешом лямбды. Но придется таскать индекс с собой везде

Александр
21.06.2018
08:15:07
Ну может быть

A64m
21.06.2018
08:36:07
почему? во времена С мне очень не хватало таких typedef, которые компилятор считает другим типом
речь о тех случаях, когда программисту совсем не хочется чтб что-то считалось другим типом, но это приходится делать для того чтоб управлять выбором инстанса, например

A64m
21.06.2018
08:38:05
да, или вон случай с обсуждения которого все началось, когда оборачивать приходится из-за инъективности

Алексей Ayaye :)
21.06.2018
08:38:11
ну вот когда мы к числам хотим разные операции применять - сложение и умножение, мы же используем разные значки. значит и тут какой-то похожий механизм нужен

Alexander
21.06.2018
08:43:01
когда мы к моноидам разнвм применяем сложение, мы используем один и тот же значек

kana
21.06.2018
09:29:46
это же возможно бесконечная таблица (то есть мб задана правилами, а не перебором всех вариантов) соответствий входу и выходу, + замыкание

Евгений
21.06.2018
09:32:39
Функция это структура данных + правило редукции

Денис
21.06.2018
09:38:42
Функция это main, а структура данных это struct foo { int bar; };

sherzod
21.06.2018
09:38:49
Это в какой формальной системе? По моему неавторитетному мнению, экзистенциальность вопроса в его противоречивости. Или есть строгое формальное определение структуры данных?..

Ilya
21.06.2018
10:05:37
А мап между двумя структурами данных -- это структура данных?

Алексей Ayaye :)
21.06.2018
10:06:40
вообще - первичны данные. это какая-то информация в комплюктере. а структура лишь дает интерфейс для работы с ними.

Ilya
21.06.2018
10:07:38
функция это тоже информация в комплюктере

Алексей Ayaye :)
21.06.2018
10:07:55
структуры данных изучают, чтобы эти интерфейсы были удобные, эффективные и т.п

Yuriy
21.06.2018
10:09:09
Dmitry
21.06.2018
10:13:58
ноймана?

сноймана? фон неймана?

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