
Alexandr
04.10.2017
12:35:43
Всем привет! Может кто подсказать как можно справиться с подсказками связанные с зависимостями, использую vscode и haskero? Чтобы не делал, постоянно вылезают ошибки о том, что модулей, которые я иморчу не существует

Aleksey
04.10.2017
12:37:38
Модули прописаны в cabal-файле?

Alexander
04.10.2017
12:37:55
скорее зависимости не прописаны
пакеты в которых эти модули

Google

Alexandr
04.10.2017
12:38:12
Да, прописывал в кабалфайле, все компилится и работает

Alexander
04.10.2017
12:38:14
вообще если писать саму ошибку, то это может помочь

Yuriy
04.10.2017
12:38:17
или haskero неправильно запускает stack

Alexander
04.10.2017
12:38:24
или кабал

Alexandr
04.10.2017
12:42:00
я очень зря панику поднял, прошу меня простить:)
Просто я открывал не проект, а папку с проектами из-за этого и получал проблемы

Alexander
04.10.2017
12:42:52
=)

Alexandr
04.10.2017
12:44:06
А можно-ли haskero научить давать подсказки по глобальным зависимостям?
Например у меня стоит квикчек и я хочу что-то быстро проверить, но создавать для этого проект - было бы излишне

Aleksey
04.10.2017
12:53:37
Всегда можно сделать самостоятельный скрипт и спец комменте указать, какие пакеты нужны для запуска. Тогда пакеты установтся в "глобальный проект"
Или можно вне проекта сделать stack install quickcheck - пакет установится в global project и будет доступен при stack runhaskell и stack ghci

Alexandr
04.10.2017
13:00:43
Так и сделал, спасибо! Туплю немного)

Aleksey
04.10.2017
13:01:49
А если быстро-быстро что-то проверить хочется, то
stack ghci --package=turtle --package=foldl и т.д.

Google

Aleksey
04.10.2017
13:10:22
Кто уже early bird'нулся на fbyby?

Alexander
04.10.2017
13:13:50
я ещё нет но надо бы

Aleksey
04.10.2017
13:16:56
115BYN (3.3т.р)

Yuriy
04.10.2017
13:33:12
боюсь опять драться за еду
подожду настоящих билетов

Andrew
04.10.2017
17:03:16
Как там кстати Fabien Potencier))?

Konstantin
04.10.2017
17:07:31
К сожалению я не знаю, кто это
а вопрос был простой
я хотел подрубить ДИ контейнер в ентити
ессно, все начали орать, что я мудак и этого категорически делать нельзя
и никто не объяснил почему
но свой ушат говна вылил просто каждый

Julian
04.10.2017
17:38:18
Подключение контейнера к энтити - это начала конца по мнению многих. Очень велик соблазн начать усложнять энитити и пихать туда логику, а не использовать православные сервисы.

Andrew
04.10.2017
17:40:46

Blinchik
04.10.2017
17:44:38
Есть функция с сигнатурой
mapBoth :: forall b c . (forall a . [a] -> [a]) -> [b] -> [c] -> ([b], [c])Берёт 2 списка разных типов и применяет к ним функцию. Если я попытаюсь передать первым аргументом функцию с какими-нибудь констрейнтами (например sort), оно не скомпилируется. Как написать чтобы компилировалось?

kana
04.10.2017
17:48:16
у тебя тут сказано, что первая функция - forall a . [a] -> [a], то есть она должна работать ДЛЯ всех a, под такую сигнатуру только id подходит

? animufag ?
04.10.2017
17:48:29
не

kana
04.10.2017
17:48:31
ну, map id

? animufag ?
04.10.2017
17:48:36
он знает что это списки

Google

? animufag ?
04.10.2017
17:48:44
может длину менять
дублировать элементы

kana
04.10.2017
17:49:09
хм, да, не подумал

? animufag ?
04.10.2017
17:49:30
констрейнты на а он наложить не сможет
ну разве что сразу в сигнутуре mapBoth
первый forall я так понимаю можно опустить - хаскел и так его по умолчанию ставит

Blinchik
04.10.2017
17:51:15
Я понимаю почему не работает
Я спрашиваю как сделать чтобы работало

? animufag ?
04.10.2017
17:51:52
ага ок
только я туговат и пишу для себя.

Blinchik
04.10.2017
17:52:37
Оно должно для любых констрейтов работать

nsdkfhudorgihn
04.10.2017
17:53:14
а че компилятор говорит?

Blinchik
04.10.2017
17:53:41
Не определен Eq для a
No instance for (Ord a) arising from a use of ‘sort’

nsdkfhudorgihn
04.10.2017
17:54:48
ну так, чтоб сорт работал, и b и c должны принадлежать Орд а
попробуй в сорте укажи или сюда орд добавь сначала

? animufag ?
04.10.2017
17:55:26
они могут принадлежать
всё равно не сработает

Artyom
04.10.2017
17:55:36
это известная задача вроде бы
в упрощённом варианте, “какой тип у функции \f -> (f True, f "foo") ”

Google

Artyom
04.10.2017
17:56:32
только вот решения я не помню :( или вообще никак не решается, или через какую-то жуть

Pavel
04.10.2017
17:56:39

kana
04.10.2017
17:56:48
типа такого нельзя сделать?
mapBoth :: (cnt b, cnt c)
=> Proxy cnt
-> (cnt a => [a] -> [a])
-> [b]
-> [c]
-> ([b], [c])
mapBoth Proxy f [] [] = ([], [])
mapBoth Proxy f xs ys = (f xs, f ys)
это не работает, конечно

Alexander
04.10.2017
17:57:49
f :: forall x . x -> () например
тогда функия \f -> (f True, f "foo") будет :: (forall x. x -> ()) -> ((),())
можно сделать более внятную

? animufag ?
04.10.2017
17:58:36

Alexander
04.10.2017
17:58:49
можно

Artyom
04.10.2017
17:59:00
@qnikst не, ну разумеется, но надо не “любой тип”, а “наиболее общий”

kana
04.10.2017
17:59:05
ну, контрейт - это обычный тип, а тип через проки можно передать

Alexander
04.10.2017
17:59:13
что значит наиболее общий для Haskell?
у нас subtyping не завезли

Pig
04.10.2017
17:59:34
Вот так работает sort:
mapBoth :: (Ord b, Ord c) => (forall a. Ord a => [a] -> [a]) -> [b] -> [c] -> ([b], [c])

Alexander
04.10.2017
17:59:50
я начала дискуссии не видел если что

Artyom
04.10.2017
17:59:51
я вот как раз только собирался добавить сноску “for some reasonable definition of ‘наиболее общий’”
:troll:

Alexander
04.10.2017
18:00:04
=)

Artyom
04.10.2017
18:01:41
я думаю, в этом случае пойдёт любой тип, который позволит передавать функции вида f :: forall a. (c1 a, c2 a, ...) => a -> B, где String и Bool удовлетворяют всем констрейнтам c1, c2, ...

? animufag ?
04.10.2017
18:02:45
погуглил прокси и там как обычно

kana
04.10.2017
18:04:19
кстати, вполне работает, лол
отдает
([2,3],[True,True])

Google

kana
04.10.2017
18:04:21

? animufag ?
04.10.2017
18:04:58
ну разве что сразу в сигнутуре mapBoth
Не подходит такой вариант к сожалению
Вот так работает sort:
mapBoth :: (Ord b, Ord c) => (forall a. Ord a => [a] -> [a]) -> [b] -> [c] -> ([b], [c])

Pig
04.10.2017
18:05:34
А без первого кейса с пустыми списками будет работать?

kana
04.10.2017
18:06:03
ой, там случайно
первый кейс не нужен, я просто сначала не так сигнатуру понял и начал писать рекурсивно, а потом увидел, что функция со списком работает

Pig
04.10.2017
18:07:42
(Используемые расширения RankNTypes и ConstraintKinds, если ghci правильно подсказывает.)

kana
04.10.2017
18:07:44

? animufag ?
04.10.2017
18:08:01
https://hackage.haskell.org/package/base-4.10.0.0/docs/Data-Proxy.html

kana
04.10.2017
18:08:02

? animufag ?
04.10.2017
18:08:22
https://hackage.haskell.org/package/tagged-0.7.2/docs/Data-Proxy.html
кстати интересно было бы посмотреть на hackage с позиции иерархии модулей

kana
04.10.2017
18:10:08
это просто единичный тип с фантомным параметром, который можно использовать для передачи типа

? animufag ?
04.10.2017
18:10:16
да

kana
04.10.2017
18:10:31

? animufag ?
04.10.2017
18:11:22
к сожелению это сложно написать в модуле
лучше написать рекурсивное определение, мол здесь в модуле описан прокси тип, про который вы несомненно слышали, иначе зачем сюда вообще смотрите

Blinchik
04.10.2017
18:18:27
У меня не компилируется
И оно должно работать так:
ghci> mapBoth (nub . sort) [10, 2, 1, 2] [True, False, True]
([1, 2, 10], [False, True])
ghci> mapBoth ((:[]) . product . nub) [10, 2, 1, 2] [5.3, 4.2]
([ 20 ], [ 22.26 ])