
Aleksey
26.06.2018
08:30:20
Принципиально там ничего не менялось с тех пор.
https://markkarpov.com/learn-haskell.html#megaparsec-tutorials тут рекомендуемые автором мегапарсека туториалы
Может что-то из этого будет работать :) Хотя там статьи ещё более старые судя по датам публикации
> The tutorials here have been updated to be used with Megaparsec 6

Google

Aleksey
26.06.2018
08:35:03
Вот это говорит нам, что материал должен быть плюс-минус актуальным

Alex
26.06.2018
08:35:24
Подскажи пожалуйста, как обьявить тип Parser чтобы первый пример заработал?

Aleksey
26.06.2018
08:35:51
https://hackage.haskell.org/package/megaparsec-6.5.0/docs/Text-Megaparsec.html
Прямо в начале доки
Parser Void Char видимо

Alex
26.06.2018
08:37:14
Действительно
Спасибо:)

Aleksey
26.06.2018
08:38:13
?

Alex
26.06.2018
10:25:46
cls :: Parser String
cls = do
many letterChar
char '('
name <- many alphaNumChar
Джентельмены, подскажите в чем ошибка
The last statement in a 'do' block must be an expression
name <- many alphaNumChar

Maxim
26.06.2018
10:26:52
убери name <-

Leonid
26.06.2018
10:26:53
Последняя строка должна быть без var <-

Google

Maxim
26.06.2018
10:26:59
зачем тебе это имя в любом случае?
можно дописать return name в конце, но в этом все равно нет смысла

Alex
26.06.2018
10:27:43
Мне нужно чтобы эта функция вернула то что запарсит последняя строка
Как это сделать?

Yuuri
26.06.2018
10:28:07
А что за парсер такой с непарной скобкой?

Leonid
26.06.2018
10:28:14
cls :: Parser String
cls = do
many letterChar
char '('
many alphaNumChar

Alex
26.06.2018
10:31:20

Ilya
26.06.2018
10:33:05

Alex
26.06.2018
10:33:20
А есть?

Ilya
26.06.2018
10:38:30
ну сходу нашлись биндинги к клангу (http://hackage.haskell.org/package/LibClang) и чьё-то самописное на парсеке (https://hackage.haskell.org/package/cparsing)
тебе прям нужно полноценно C++ парсить и рефакторить, или всё же задача проще?

Alex
26.06.2018
10:42:29
Есть десятки тысяч строк кода месседжей. Случился рефакторинг и теперь они должны выглядеть иначе.
Было два пути
Либо всех их менять руками
Что больно, либо написать скрипт
Я решил писать на хаскеле, потому что хочется:)

Ilya
26.06.2018
10:44:45
для простого рефакторинга не обязательно прям разбирать код по-настоящему, конечно
так что те пакеты может и оверхед

Alex
26.06.2018
10:52:42
У нас очень специфичный препроцессор

Google

Alex
26.06.2018
10:53:02
Думаю лучше будет распарсить руками

Alister
26.06.2018
11:27:45
головой

Alex
26.06.2018
12:17:35
Сори за глупый вопрос
Как из IO string сделать String
Я просто в ghci гружу из файла

Maxim
26.06.2018
12:18:22
в ghci a :: IO String при печати будет выведено как есть
> a <- return "bla" :: IO String
> a
bla
как-то так

Alex
26.06.2018
12:18:43
Не, я его потом отправляю в функу которая ждет стринг
А
Я понял

Maxim
26.06.2018
12:19:09
?

Ilya
26.06.2018
12:19:10

Alex
26.06.2018
12:19:12
Да
Я уж понял:)
Спасибо

Maxim
26.06.2018
12:19:46
ну можно и fmap, но понятнее наверное к имени привязать

Alex
26.06.2018
12:20:23
У меня такая фукнция
parseTest enum str
str это IO String

Google

Alex
26.06.2018
12:20:58
Где писать fmap

Ilya
26.06.2018
12:21:23
Перед parseTest
parseTest enum <$> str

Maxim
26.06.2018
12:22:22
fmap (parseTest enum) str
или как выше ^
или
s <- str
parseTest enum s
хоть мы и в хаскельном чате, а не в каком-то другом, все равно explicit is better than implicit
по крайней мере в обучении

Alex
26.06.2018
12:23:21
Парни

Admin
ERROR: S client not available

Alex
26.06.2018
12:23:25
Спасибо

Ilya
26.06.2018
12:24:17

Index
26.06.2018
13:08:32
Есть какой-нибудь язык с алгебраическими типами данных, в котором был бы products-of-sums, а не sums-of-products подход?
Я сейчас с этим экспериментирую, но хотелось бы prior art посмотреть

Александр
26.06.2018
13:09:08
А что это??

Index
26.06.2018
13:09:55
Ну в Haskell тип обычно выглядит как data T = A X Y | B M N, что аналогично Either (X, Y) (M, N)
sum of products
и генерики соответствующие, https://hackage.haskell.org/package/generics-sop
Мне интересен подход, в котором будет наоборот, что-то вроде
data T = MkT (A | B) (C | D)

Александр
26.06.2018
13:11:28
У меня не хватает фантазии понять, в чем разница

Google

Александр
26.06.2018
13:11:47
Кроме синтаксиса, пожалуй

Index
26.06.2018
13:12:28
Ну первое следствие тут в том, что из-за того, что у сумм нет ассоциированных с ними конструкторов, то мы получаем A | A = A

Ilya
26.06.2018
13:12:56

Index
26.06.2018
13:13:00
А все типы-произведения должны себя идентифицировать а-ля Typeable, чтобы можно было по этим суммам матчить
То есть с точки зрения рантайма мы переносим локальные теги сумм в глобальные теги произведений

Ilya
26.06.2018
13:14:16

Index
26.06.2018
13:14:17
а получаем из этого нормализацию типов-сумм, они образуют semilattice

Ilya
26.06.2018
13:14:42
у редхата был язык с ними, забыл название

Index
26.06.2018
13:14:45
если ты про union а-ля C++, где он untagged, то да
но в C++ они работают с reinterpret-cast, а я хочу сместить тэг из суммы в каждое произведение

Ilya
26.06.2018
13:15:07
нет, я про теоретико-типовой юнион
но в Си похоже

Yuriy
26.06.2018
13:15:37

Ilya
26.06.2018
13:16:02
A | A = A -- это уже не сумма

Index
26.06.2018
13:16:23
это не disjoint union

Ilya
26.06.2018
13:16:26
т.к. A + A = 2 * A

Alex
26.06.2018
13:16:56
Еще один глупый вопрос

Index
26.06.2018
13:17:06

Alex
26.06.2018
13:17:15
Как с помощью мегапарсека взять всю строку?

Index
26.06.2018
13:17:27
takeRest вроде был

Alex
26.06.2018
13:18:13
Он кажется вообще все возьмет

Index
26.06.2018
13:18:37
так ты и просишь вообще все взять?