Alexander
как там явно показывать типы по очереди, чтобы дырки заполнять?
Anton
Timofey
Вопрос по stack dot- он умеет графы зависимостей для проектов с несколькими executables?
Timofey
у меня в проекте их два, binary1 и binary2, команда stack dot binary2 всё равно строит граф для binary1
undefined
А если попробовать stack dot :binary2?
Cheese
странно
Cheese
может, 2 зависит от 1?
Cheese
судя по справке, он должен отдельно с компонентом работать
Cheese
executables в разных пакетах или в одном?
Timofey
Timofey
Timofey
Есть подозрение, что он строит один граф для проекта целиком
Cheese
должен обрезать
Cheese
вторая программа зависит от первого пакета?
Timofey
кажется. он учитывает name из projectName.cabal
Cheese
Cheese
строго говоря, нельзя зависеть от либы как компонента, только от пакета целиком
Timofey
Cheese
нет, всё правильно, это очень тонкая тонкость
Timofey
в таком случае да, оба экзешника завсят от всего пакета
Cheese
если программа Б зависит от пакета А, то программы в пакете А тоже должны собираться для Б
Cheese
или общая библиотека в третьем пакете?
undefined
Похоже, что таки не умеет. Цитата:
Side note: When any exe component is specified, all of the package's executable components will be built. This is due to limitations in all currently released versions of Cabal. See issue#1046
https://docs.haskellstack.org/en/v1.7.1/build_command/#target-syntax
Cheese
Timofey
name: projectName
library:
...
executables:
binary1:
dependencies:
- projectName
- optparse-applicative
binary2:
dependencies:
- shake
- projectName
Timofey
выдержка из package.yaml
Cheese
Timofey
и перепутал модули и пакеты =|
Cheese
вряд ли модули
Cheese
проект (stack.yaml) состоит из пакетов (package.yaml | *.cabal)
Cheese
пакет — из компонентов
Cheese
компонент = библиотека | программа | тест
Cheese
у тебя здесь один проект, один пакет, 3 компонента
Cheese
а собирать одну программу из пакета Кабал не умеет
Cheese
поэтому граф для binary2 включает и binary1
Timofey
Спасибо, теперь стало ясно =)
Cheese
если разнести по разным пакетам, то, может, будет лучше
Alex
Господа, а как узнать в мегапарсеке, что парсер зафейлил?
Cheese
для чего?
Cheese
p1 <|> p2 — если начался p2, то p1 зафэйлил, например
Alex
Вот такой код pos :: Parser Position
pos = do
posName <- clexem
c <- anyChar
if c == ',' then
return $ Position posName ""
else if c == '=' then do
posValue <- clexem
try $ char ','
return $ Position posName posValue
else
return $ Position posName ""
Alex
c <- anyChar в вот этот момент парсер может зафейлить и если это так, то мне нужно не выполняться дальше
Alex
Как это сделать?
Alex
Try не подходит, потому, что я не знаю успешно он там отработал или нет
Dmitry
if ... else if... лучше на case заменить.
Alex
Справедливо
Maxim
парсер же и так зафейлится весь если какая-то его часть фейлится, зачем что-то еще городить?
Maxim
(или я не понял?)
Alex
Мне нужно что в стиле try, который дает понять, сфейлилось оно там внутри или нет
Alex
Не подскажите?:)
Dmitry
c <- anyChar `onException` return '$'
Dmitry
Смотри Control.Monad.Catch, ищи функции по вкусу
Ilya
эксепшены в парсере это нормально?
Alex
Почему-то фейлиться вот так
Alex
``` c <- anyChar onException return $ Position posName "" ```
Alex
c <- anyChar `onException` return `$` Position posName ""
Alex
Не компилится
Alex
Вот такая ошибка
Alex
parse error on input `$'
Dmitry
return (Postion posName "")
Alex
c <- anyChar `onException` return (Position posName "")
Alex
Вот такая ошибка
Alex
No instance for (Control.Monad.Catch.MonadCatch
(ParsecT Void String Data.Functor.Identity.Identity))
arising from a use of `onException'
Alex
Я неправильно написал?
Cheese
какие ещё исключения? несовпадения в парсере не бросают исключения
Cheese
попробуй через <|>
Cheese
кстати, это какой парсек?
Alex
мега
Alex
megaparsec
Alex
Эта штука не поможет, потому, что тогда я не смогу узнать что в c
Alex
Я кажется придумал грязный хак
Cheese
Alex
то есть мне нужно будет проверить как в стиле if c == undefined
Alex
?
Maxim
Alex
Я знаю
Dmitry
Ilya
сдается мне, ты хочешь optional