

Denis
26.08.2017
12:42:21
вопрос, есть код
partitionByCond :: Ord a => (a -> a -> Bool) -> [a] -> [[a]]
partitionByCond cond = para psi where
psi :: ListF a ([a], [[a]]) -> [[a]]
psi = \case
Nil -> []
Cons x (a:_, a':b') | cond x a -> (x:a'):b'
Cons x (_, r) -> [x]:r
но он дает ошибку
src/Experiments2.hs:1359:32: error:
• Couldn't match expected type ‘a’ with actual type ‘a1’
‘a1’ is a rigid type variable bound by
the type signature for:
psi :: forall a1. ListF a1 ([a1], [[a1]]) -> [[a1]]
at src/Experiments2.hs:1356:10
‘a’ is a rigid type variable bound by
the type signature for:
partitionByCond :: forall a.
Ord a =>
(a -> a -> Bool) -> [a] -> [[a]]
at src/Experiments2.hs:1354:20
• In the first argument of ‘cond’, namely ‘x’
In the expression: cond x a
In a stmt of a pattern guard for
a case alternative:
cond x a
• Relevant bindings include
b' :: [[a1]] (bound at src/Experiments2.hs:1359:21)
a' :: [a1] (bound at src/Experiments2.hs:1359:18)
a :: a1 (bound at src/Experiments2.hs:1359:13)
x :: a1 (bound at src/Experiments2.hs:1359:10)
psi :: ListF a1 ([a1], [[a1]]) -> [[a1]]
(bound at src/Experiments2.hs:1357:3)
cond :: a -> a -> Bool (bound at src/Experiments2.hs:1355:17)
(Some bindings suppressed; use -fmax-relevant-binds=N or -fno-max-relevant-binds)
Failed, modules loaded: none.
Если убираешь тип у psi то все ок, но мне нужно с типом сделать


kana
26.08.2017
12:44:50
ScopedTypeVariables

Denis
26.08.2017
12:45:31
это тут при чем?

kana
26.08.2017
12:45:43
Чтобы хаскель знал, что это один и тот же a, не?

Google

Denis
26.08.2017
12:46:19
нет
тут с x трабла

Vyacheslav
26.08.2017
12:50:37
Привет, а поясните мне за эксепшены. Смотрю тут на http-conduit, и она вроде как кидает эксепшн если запрос зафэйлился, а простого способа узнать какие нет. Это считается нормальным (то что в типе не видно что оно может кинуть)?
Или может это просто плохая либа и надо что-то другое юзать

kana
26.08.2017
12:55:24
Ну я перечитал ошибку несколько раз и она именно про это. A в cond и A в psi - разные типы, сделай их одним с помощью STV. Если это неверно, то хотя бы узнаю об этом точно
нет
тут с x трабла

Denis
26.08.2017
12:57:29
тут еще partitionByCond :: forall a. Ord a => (a -> a -> Bool) -> [a] -> [[a]] forall нужен был

Тёма
26.08.2017
12:57:58
http://www.michaelburge.us/2017/08/25/writing-a-formally-verified-porn-browser-in-coq.html

kir
26.08.2017
13:59:23
STV + forall

Vasiliy
26.08.2017
13:59:28
Привет, а поясните мне за эксепшены. Смотрю тут на http-conduit, и она вроде как кидает эксепшн если запрос зафэйлился, а простого способа узнать какие нет. Это считается нормальным (то что в типе не видно что оно может кинуть)?
про исключения много чего говорят, кто-то говорит никогда их не использовать, только ExceptT IO, кто-то, наоборот, говорит, что если есть IO, то ExceptT и прочее не нужно, есть разные реализации checked-исключений, но факт в том, что если есть IO, то исключение может прилететь какое угодно в любой момент времени, и с этим приходится жить
касательно http-conduit - если сами conduit не нужны, то можно взять http-client

Yuriy
26.08.2017
14:01:45
@seogud, питонисты и жаваскриптеры самые востребованные, по-моему

Google

Alex
26.08.2017
14:02:55
Джависты еще.

Yuriy
26.08.2017
14:03:57
блин, опять я влез, когда всё уже обсудили

Vyacheslav
26.08.2017
14:04:01
про исключения много чего говорят, кто-то говорит никогда их не использовать, только ExceptT IO, кто-то, наоборот, говорит, что если есть IO, то ExceptT и прочее не нужно, есть разные реализации checked-исключений, но факт в том, что если есть IO, то исключение может прилететь какое угодно в любой момент времени, и с этим приходится жить
так а как жить?

Yuriy
26.08.2017
14:04:01
простите

Vyacheslav
26.08.2017
14:04:14
я по сути использую http-client, видимо
conduit мне не очень нужен
делать какой-то catchAll в этом месте?

Yuriy
26.08.2017
14:04:54

Denis
26.08.2017
14:05:27

Vyacheslav
26.08.2017
14:05:51
можно немно подробнее

Yuriy
26.08.2017
14:11:31
http://hackage.haskell.org/package/unexceptionalio
это такое IO, из которого ничего (синхронного) не вылетает
я его не использовал, но я и от исключений не страдаю


Alex
26.08.2017
16:21:21
Q Q:
Здравствуйте, подскажите пожалуйста мне 36 , память и вообще мышление не так остро работают как прежде. Хочу уйти в онлайн профессии , где можно работать по удаленке.
Рассматривал позиции seo,smm , директоров, но сейчас все это упростилось , что эти профессии не востребованы и платят не много, я уже не говорю про дизайнеров, всех этих профессий , закат наступил в 2014 году, да безусловна ассы своего дела востребованы Но это ассы, к которым я себя не отношу.
И из всех "онлайн профессий" я так понял , возможно я ошибаюсь поправьте меня если не так являются программисты, даже плохой программист получает не плохо.
Но этих видов программистов тысячи.
Теперь собственно вопросы:
Какую именно специализацию выбрать, чтобы было бы поменьше изучения и стабильная востребованность
И второй вопрос есть, ли что нибудь, чтобы ты пришел одновременно работал бы программистом и обучался этому в команде по удаленке?
P.s / понимаю сейчас будет много флуда, но Гугл ответов не дал
лучшее щас: крипта.


Vasiliy
26.08.2017
16:35:29
делать какой-то catchAll в этом месте?
я лично, начитавшись статей сноймана, использую safe-exceptions для обработки исключений и шарюсь в случае необходимости по документации и коду, выясняя, какие именно исключения могут вылететь

Alexander
26.08.2017
17:07:03
но safe-exceptions же только для чуть более аккуратной работы с асинхронными исключениями

Leonid
26.08.2017
17:11:14
и это очень хорошо

Alexander
26.08.2017
18:32:04
нормально

Андрей
26.08.2017
19:19:29

Google

Leonid
26.08.2017
19:19:43
:)

sojalei
26.08.2017
19:19:48

Q
27.08.2017
09:42:45

Никита
27.08.2017
09:49:22
Если из хаскеля убрать вопрос, то получится ад
Проверяйте

Leonid
27.08.2017
10:07:15
@seogud займись devops и смотри на чем популярно ароматизации писать
Автоматизации
Хотя..

Ilya
27.08.2017
11:40:30
Вы ловили ошибку GHC "My brain just exploded"? ?
С юмором они там
My brain just exploded
I can't handle pattern bindings for existential or GADT data constructors.
Instead, use a case-expression, or do-notation, to unpack the constructor.
в первый раз вижу, чтобы компилятор о себе говорил в первом лице
киллер-фича хаскель!

Владислав
27.08.2017
11:52:28
Какую ошибку надо допустить, чтобы он о себе в первом лице заговорил?)

Alexander
27.08.2017
11:55:29
ловил
gadt в лет развернуть и готово
let A s = myGadt

Ilya
27.08.2017
13:01:57
Да походу не туда forall воткнул
Как завернуть полиморфную функцию в конструктор? Чтобы её можно было доставать
Собсно это я и хотел сделать
Типа data X b = X (t a -> b), функция внутри полиморфна по a

Google

Dmitry
27.08.2017
14:18:03
Добавить forall? Например, как это сделано с типом Fold из прекраснейшей библиотеки foldl
data Fold a b
-- | @Fold @ @ step @ @ initial @ @ extract@
= forall x. Fold (x -> a -> x) x (x -> b)

Ilya
27.08.2017
14:49:30
Забавно, что ghc это спокойно съел
Но зато потом стал ругаться "my brain just exploded"
А что вообще значит эта конструкция?
data X b = forall a. X (t a -> b)
Компилится, но не даёт развернуть конструктор

Alexander
27.08.2017
15:03:36
это exists
очень приближенно
смысл совсем разынй и конструкция валидная

Index
27.08.2017
18:02:20
В 8.2 такой ошибки больше нет

Alexander
27.08.2017
18:09:46
о круто, можно пару мест уростить
*упростить
@Masteroid data X b = X (forall a . a -> b) значит, что в X лежит функция, которая работает для любого типа a который подставит тот, кто разворачивает значение, data X b = forall a . X (a -> b) значит, что в X лежит функция работающая для какого-то конкретного a, который определил тот, кто эту функцию в X клал

Ilya
27.08.2017
18:19:16
По-моему видел такую конструкцию в статье про гетерогенные списки

Alexander
27.08.2017
18:21:27
что интересно без доп констрейнта вторая конструкция бесполезна, т.к. ты того a не знаешь
вообще я чаще её встречаю, но например как data SomeFoo = forall x . Foo x, Typeable x => SomeFoo x
ну или т.п.

Ilya
27.08.2017
18:22:29
Констрейнт это в смысле ограничить тип?
Принадлежностью к классу

Google

Alexander
27.08.2017
18:22:42
да

Ilya
27.08.2017
18:22:51
Прикольно

Alexander
27.08.2017
18:22:55
тогда ты точно знаешь что можешь применять методы этого класса к значению

Ilya
27.08.2017
18:23:29
Хаскель не перестает удивлять

Alexander
27.08.2017
18:23:45
а что тут удивительного?

Ilya
27.08.2017
18:24:21
Для меня это выглядит как хак для неполноценной системы типов х-ля

Alexander
27.08.2017
18:24:42
хак это unsafeCoerce
вот это действтиельно хак
а то это варианты использования системы типов
причем являющиеся её частью
как сказать, что интерфейсы это хак системы типов явы

Ilya
27.08.2017
18:25:48
Ну если бы были вложенные типы (вместо классов), то это бы не потребовалось

Alexander
27.08.2017
18:26:20
с чего бы вдруг?

Ilya
27.08.2017
18:27:33
с чего бы вдруг?
Ну скажем можно было бы указать конкретный тип 'a', а именно Show или Num или че там нам надо делать с элементами этого гетерогенного списка

Alexander
27.08.2017
18:27:40
тем более если бы были вложенные типы, то не работало бы все остальное
почему?
в смысле как

Ilya
27.08.2017
18:29:16
Указать максимально общий тип, который нам нужен
Конкретный

Alexander
27.08.2017
18:29:44
у тебя это data Foo x = forall Foo x . Foo - говорит о том, что словарь для Foo для типов нужен в рантайме