@haskellru

Страница 1306 из 1551
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
?

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
Спасибо

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, чтобы можно было по этим суммам матчить

То есть с точки зрения рантайма мы переносим локальные теги сумм в глобальные теги произведений

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
Есть какой-нибудь язык с алгебраическими типами данных, в котором был бы products-of-sums, а не sums-of-products подход?
в dhall суммы и произведения развязаны, можно комбинировать в любом порядке

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
т.к. A + A = 2 * A
логично, значит не суммы

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
так ты и просишь вообще все взять?

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