Vladislav
Есть какой-нибудь язык с алгебраическими типами данных, в котором был бы products-of-sums, а не sums-of-products подход?
Vladislav
Я сейчас с этим экспериментирую, но хотелось бы prior art посмотреть
Alexander
А что это??
Vladislav
Ну в Haskell тип обычно выглядит как data T = A X Y | B M N, что аналогично Either (X, Y) (M, N)
Vladislav
sum of products
Vladislav
и генерики соответствующие, https://hackage.haskell.org/package/generics-sop
Vladislav
Мне интересен подход, в котором будет наоборот, что-то вроде
data T = MkT (A | B) (C | D)
Alexander
У меня не хватает фантазии понять, в чем разница
Alexander
Кроме синтаксиса, пожалуй
Vladislav
Ну первое следствие тут в том, что из-за того, что у сумм нет ассоциированных с ними конструкторов, то мы получаем A | A = A
Ilya
Vladislav
А все типы-произведения должны себя идентифицировать а-ля Typeable, чтобы можно было по этим суммам матчить
Vladislav
То есть с точки зрения рантайма мы переносим локальные теги сумм в глобальные теги произведений
Ilya
Vladislav
а получаем из этого нормализацию типов-сумм, они образуют semilattice
Ilya
у редхата был язык с ними, забыл название
Vladislav
если ты про union а-ля C++, где он untagged, то да
Vladislav
но в C++ они работают с reinterpret-cast, а я хочу сместить тэг из суммы в каждое произведение
Ilya
нет, я про теоретико-типовой юнион
Ilya
но в Си похоже
Cheese
Ilya
A | A = A -- это уже не сумма
Vladislav
это не disjoint union
Ilya
т.к. A + A = 2 * A
Alex
Еще один глупый вопрос
Alex
Как с помощью мегапарсека взять всю строку?
Vladislav
takeRest вроде был
Alex
Он кажется вообще все возьмет
Vladislav
так ты и просишь вообще все взять?
Ilya
редхатовский язык назывался Ceylon -- компилировался на JVM (и вообще чем-то похож на Скалу), там у них все на union-типах было сделано
Ilya
хотя я давно смотрел
Ilya
Alex
Мне нужно до конца строки
Alex
до \n
Vladislav
Vladislav
а, строку в смысла line, а не string
Alex
Да
Vladislav
takeWhileP (/='\n') как вариант
Евгений
manyTill?
Vladislav
я советую takeWhileP, потому что он быстрее
Alex
Спасибо
Alex
Не выходит
Alex
'''
takeWhileP (\a -> a /= '\n') '''
Alex
Так тоже не выходит
Cheese
что значит "не выходит"?
Cheese
получается что-то другое?
Alex
* Couldn't match expected type `Maybe String'
with actual type `Char -> Bool'
* The lambda expression \ a -> a /= '\n' has one argument,
but its type `Maybe String' has none
In the first argument of takeWhileP', namely (\ a -> a /= '\n')'
In a stmt of a 'do' block: takeWhileP (\ a -> a /= '\n')
|
27 | takeWhileP (\a -> a /= '\n')
Cheese
так это не "кобыла не едет", а ты её не запряг ещё
Alex
Хорошо, а что делать?
Cheese
вызвать takeWhileP правильно
Alex
А что у меня неправильно?
Cheese
для этого почитать её документацию, например
Alex
Я читаю
Cheese
А что у меня неправильно?
компилятор же рассказал, тип неправильный, ты предикат передаёшь первым аргументом, а надо вторым
Зигохистоморфный
ну или если так хочется, то или сечение или flip
Cheese
Зигохистоморфный
будет не первым, а вторым
Cheese
там аргумент просто пропущен
Зигохистоморфный
аа
Зигохистоморфный
ок
Cheese
хоть флипай, хоть не флипай, а другой аргумент передавать надо
Alex
Alex
И я не понял
Alex
ЧТо нужно передавать первым аргументом
Alex
Объясни пожалуйста
Cheese
takeWhileP
:: Maybe String -- ^ Name for a single token in the row
-> (Token s -> Bool) -- ^ Predicate to use to test tokens
-> m (Tokens s) -- ^ A chunk of matching tokens
Cheese
первый аргумент — Maybe String — ^ Name for a single token in the row
Alex
Что это значит
Alex
Похоже я не понимаю что эта штука делает вообще
Alex
Мне нужно просто взять все символы до конца строки
Cheese
это уже не про хаскель
Cheese
https://translate.yandex.ru/?lang=en-ru&text=Name%20for%20a%20single%20token%20in%20the%20row
Евгений
Ппц ты токсичный
Vladislav
Просто передай туда Nothing
Vladislav
это используется для сообщений об ошибках парсинга только
Alex
Спасибо:)
Alex
Все ок,