
Terminator
09.10.2018
15:00:36
@AnnSotnik будет жить. Поприветствуем!

Ann
09.10.2018
15:00:52
Горьковский автомобильный завод приглашает принять участие в масштабном GAZ Tech хакатоне!
ГАЗ впервые проводит хакатон для IT-специалистов, способных предложить лучшие решения в сфере информационных технологий и автоматизации бизнес-процессов в области автомобилестроения.
Призовой фонд хакатона - 135 000 рублей и возможность стать частью команды ГАЗа.
GAZ Tech хакатон пройдет в два этапа:
Отборочный этап продлится до 18 октября (23:59 по Мск).
Финал хакатона пройдет 20-21 октября на территории ГАЗа в Нижнем Новгороде.
К участию приглашаются программисты и разработчики, дизайнеры, команды разработчиков, а также все заинтересованные в развитии современных технологий в автомобилестроении.
Участие бесплатное, необходима предварительная регистрация на официальном сайте http://hackathon.gaz.ru

Dmitry
09.10.2018
15:01:53
на хаскелле писать на этом хакатоне можно, @AnnSotnik ?

Александр
09.10.2018
15:02:27
Правильный вопрос - на Хаскелле после попадания в ГАЗ писать можно?

Google

Dmitry
09.10.2018
15:03:26
а зачем попадать в Газ ?

Александр
09.10.2018
15:04:02
В таком случае, зачем вообще в хакатоне участвовать?

Dmitry
09.10.2018
15:04:28
@AnnSotnik - мы очень ждём ответа, если мы его не дождемся, у нас может сложиться впечатление, что вы с нами не общаетесь, а нам рассылаете

Ann
09.10.2018
15:06:15

Dmitry
09.10.2018
15:06:28
?

Jentry
09.10.2018
15:20:38

Ann
09.10.2018
15:27:14
Ахаахаха
Ну кому как)

Yuriy
09.10.2018
15:32:06

Aleksey
09.10.2018
15:37:59

Ilya
09.10.2018
15:44:57
Всем привет. Ставил Haskell Platform отсюда https://www.haskell.org/downloads , а затем поставил stack. И теперь stack ghci работает, как ожидается, а в ghci получаю такую ошибку:
> 1 * 2
<interactive>:1:3: error:
Variable not in scope:
(*)
:: integer-gmp-1.0.2.0:GHC.Integer.Type.Integer
-> integer-gmp-1.0.2.0:GHC.Integer.Type.Integer -> t
Не подскажете, в чем причина? Нагуглить не удалось пока что
Такое ощущение, что модули, которые по умолчанию были подключены, сейчас отсутствуют

Yuriy
09.10.2018
15:51:20
запускаете в каталоге с проектом?
как будто Prelude не импортировался или base не нашлась

Google

Ilya
09.10.2018
16:00:12

Yuriy
09.10.2018
16:00:55
:load вообще для другого
попробуйте import Prelude
:load вообще для другого
:load загружает файлы-модули, а не модули из пакетов. для модулей из пакетов есть import и :module

David
09.10.2018
17:32:27
stack идет вместе с Haskell Platform. Ставится автоматически со вторым вместе
Лучше было отдельно не ставить

Ilya
09.10.2018
18:02:11
Лучше было отдельно не ставить
Это верно. Ставил сначала просто платформу погонять, но потом stack понадобился.
>для модулей из пакетов есть import и :module
Попробую завтра, на этом пк такая ошибка не воспроизводится, спасибо

A64m
09.10.2018
18:57:55
новая эра продлилась недолго
https://github.com/ghc/ghc/commit/d728c3c578cc9e9205def2c1e96934487b364b7b

Abbath
09.10.2018
19:06:20
Как нет регистров?
Собрал таки свой проект
Завендорил телеграм апи


kana
10.10.2018
05:51:43
{-# LANGUAGE DataKinds, PolyKinds, TypeOperators #-}
import Data.IORef
class IFunctor f where
imap :: (a -> b) -> (f i j a -> f i j b)
class IFunctor f => IPointed f where
ipure :: a -> f i i a
class IPointed f => IApplicative f where
iap :: f i j (a -> b) -> (f j k a -> f i k b)
class IApplicative f => IMonad f where
ijoin :: f i j (f j k a) -> f i k a
ibind :: IMonad f => f i j a -> (a -> f j k b) -> f i k b
ibind m f = ijoin . imap f $ m
newtype IIO c1 c2 a = IIO (IO a)
instance IFunctor IIO where
imap f (IIO m) = IIO (fmap f m)
instance IPointed IIO where
ipure x = IIO (pure x)
instance IApplicative IIO where
iap (IIO mf) (IIO mx) = IIO (mf <*> mx)
instance IMonad IIO where
ijoin (IIO m) = IIO (m >>= \(IIO n) -> n)
newtype IIORef i a = IIORef (IORef a)
runIIO :: IIO '[] '[] a -> IO a
runIIO (IIO m) = m
newRef :: a -> IIO is (i : is) (IIORef i a)
newRef = IIO . fmap IIORef . newIORef
freeRef :: IIORef i a -> IIO (i : is) is ()
freeRef _ = IIO (pure ())
writeRef :: IIORef i a -> a -> IIO (i : is) (i : is) ()
writeRef (IIORef ref) = IIO . writeIORef ref
readRef :: IIORef i a -> IIO (i : is) (i : is) a
readRef (IIORef ref) = IIO (readIORef ref)
lift :: IO a -> IIO i i a
lift = IIO
program =
newRef 10 `ibind` \a ->
newRef "hello" `ibind` \b ->
readRef a `ibind` \x ->
readRef b `ibind` \y ->
lift (print x) `ibind` \_ ->
freeRef b `ibind` \_ ->
freeRef a `ibind` \_ ->
ipure $ x + length y
main = runIIO program >>= print
хм, вообще это не работает
нужен способ генерить уникальные индексы на тайплевеле
https://gist.github.com/kana-sama/2134f4b1793422865284fbd2c063a5df
вроде бы если при read убирать индекс из контекста, получится что-то вроде линейщины


Oleg
10.10.2018
06:29:07
Это по мотивам blah?

kana
10.10.2018
06:29:27
да

Oleg
10.10.2018
06:30:34
Что-то вроде линейщины вряд ли получится.
Для этого нужно иметь по паре контекстов-индексов и уметь их сплиттить /склеивать
Хотя может и одного хватит

Google

Oleg
10.10.2018
06:34:15
https://gist.github.com/kana-sama/2134f4b1793422865284fbd2c063a5df
Ну и максимум здесь неверный подход.
Если из индеса будет удалена последняя переменная, а ссылку на неё припрячут.
То после выделения новой переменной, можно будет незаконно использовать припрятанную, ведь номера у них будут одинаковые.
Нужен монотонно инкрементируемый счётчик

Александр
10.10.2018
06:42:03
Что это? Для чего?
Почему на тайп левеле?

Oleg
10.10.2018
06:45:16
Ну вот надо не только писать в blah но и иногда читать его

Александр
10.10.2018
06:45:50
Среди вашего флуда про квантмех трудно найти что-то полезное

Oleg
10.10.2018
06:46:00
Ну вот как раз после них
Исходные рассуждения Вершилова и А64 были про компакты, которые можно транспортить, не копируя, если известно, что ссылок на них нет.
Я что-то вбросил про Идрис и Вершилов сказал, что можно и индексед монадкой справиться

Александр
10.10.2018
06:47:22
А, ясно, академщина

Oleg
10.10.2018
06:47:58
Ну как, рассуждения (не мои) были по мотивам продового перфоманса
Не знаю, какая тут академщина. Жиза

Abbath
10.10.2018
07:10:30
hie не умеет в new-build
Но мне это и не нужно, буду как кметт, ручками все писать

Alexander
10.10.2018
07:16:39
поидее там нужно что-то вроде RankN не знаю как правильно сработает попозже попытаюсь сделать (но это не точно)
@graninas суть простая, в расте можно добиться большей безопасности работы с ресурсами и убрать use after frwet
free
а у нас можно только регионами, которые не позволяют early free, которые (апстримовые) не работают с конкурентностью

Александр
10.10.2018
07:18:47
Ну, я такое могу сделать тоже. На фри монадах, ясное дело

Alexander
10.10.2018
07:18:48
вопрос в том можно ли в текущем сеттинге добиться похожего в сабже
не можешь конечно

Александр
10.10.2018
07:19:12
Могу

Google

Alexander
10.10.2018
07:19:24
как у них с rank2?
rankn
без них ты не сможешь сделать защиту на typelevel
и тебе нужны будут индексированные монадки

Александр
10.10.2018
07:20:08
Зачем на тайп левеле? Достаточно в рантайме

Alexander
10.10.2018
07:20:13
нет
в рантайме любой дурак может завернув ресурс в мварь
без прямого доступа

Александр
10.10.2018
07:20:54
Почему нет? Зачем усложнять? Во всех промышленных языках в рантайме делается

Alexander
10.10.2018
07:21:15
я вроде начал с описания ситуации?

Александр
10.10.2018
07:21:22
Мварь тоже помодет, да

Alexander
10.10.2018
07:21:23
в расте не в рантаймк

Александр
10.10.2018
07:21:47
Ну и молодец, rust. Хорошо придумал

Alexander
10.10.2018
07:22:39
да, там линейные типы хорошо легли

Александр
10.10.2018
07:25:33
Ну хорошо, если будет в Хаскеле. Но если надо ехать, а не шашечки, то просто надо брать и использовать кондовые практики. Они, по крайней мере, всем знакомы, и их accidental complexity не высокая.

Abbath
10.10.2018
07:26:03
fizruk здесь есть?

Anatolii
10.10.2018
07:26:19
он быстрее в gitter ответит
я его там находил


kana
10.10.2018
07:27:18
{-# LANGUAGE DataKinds, PolyKinds, TypeOperators, TypeFamilies
, UndecidableInstances, ConstraintKinds #-}
import GHC.TypeLits
import Data.IORef
type family Elem' x xs where
Elem' x '[] = False
Elem' x (x : xs) = True
Elem' x (y : xs) = Elem' x xs
type Elem x xs = Elem' x xs ~ True
type family Without x xs where
Without x '[] = '[]
Without x (x : xs) = Without x xs
Without x (y : ys) = y : Without x ys
class IFunctor f where
imap :: (a -> b) -> (f i j a -> f i j b)
class IFunctor f => IPointed f where
ipure :: a -> f i i a
class IPointed f => IApplicative f where
iap :: f i j (a -> b) -> (f j k a -> f i k b)
class IApplicative f => IMonad f where
ijoin :: f i j (f j k a) -> f i k a
ibind :: IMonad f => f i j a -> (a -> f j k b) -> f i k b
ibind m f = ijoin . imap f $ m
data IIOState = IIOState [Nat] Nat
newtype IIO (p :: IIOState) (n :: IIOState) a = IIO (IO a)
instance IFunctor IIO where
imap f (IIO m) = IIO (fmap f m)
instance IPointed IIO where
ipure x = IIO (pure x)
instance IApplicative IIO where
iap (IIO mf) (IIO mx) = IIO (mf <*> mx)
instance IMonad IIO where
ijoin (IIO m) = IIO (m >>= \(IIO n) -> n)
newtype IIORef i a = IIORef (IORef a)
runIIO :: IIO ('IIOState '[] n) ('IIOState '[] m) a -> IO a
runIIO (IIO m) = m
newRef :: a -> IIO ('IIOState is n) ('IIOState (n : is) (1 + n)) (IIORef n a)
newRef val = IIO (IIORef <$> newIORef val)
freeRef :: Elem i is => IIORef i a -> IIO ('IIOState is n) ('IIOState (Without i is) n) ()
freeRef _ = IIO (pure ())
writeRef :: Elem i is => IIORef i a -> a -> IIO ('IIOState is n) ('IIOState is n) ()
writeRef (IIORef ref) val = IIO (writeIORef ref val)
readRef :: Elem i is => IIORef i a -> IIO ('IIOState is n) ('IIOState is n) a
readRef (IIORef ref) = IIO (readIORef ref)
lift :: IO a -> IIO i i a
lift = IIO
program :: IIO ('IIOState '[] 0) ('IIOState '[] 2) Int
program =
newRef 10 `ibind` \a ->
newRef "hello" `ibind` \b ->
readRef a `ibind` \x ->
readRef b `ibind` \y ->
writeRef a 20 `ibind` \_ ->
lift (print x) `ibind` \_ ->
lift (print y) `ibind` \_ ->
readRef a `ibind` \x ->
freeRef a `ibind` \_ ->
freeRef b `ibind` \_ ->
ipure $ x + length y
main = runIIO program >>= print

Google

kana
10.10.2018
07:28:14
если спрятать и получится, то использовать - нет, но только в пределах одного блока, нужно RankN как-то впилить
например смещать на неизвестный n все индексы
зря удалил,
type family Elem' x xs where
Elem' x '[] = False
Elem' x (x : xs) = True
Elem' x (y : xs) = Elem' x xs
type Elem x xs = Elem' x xs ~ True
type family Without x xs where
Without x '[] = '[]
Without x (x : xs) = Without x xs
Without x (y : ys) = y : Without x ys
Couldn't match type
‘Elem' (1 + n) (Without n '[1 + n, n])’
with
‘'True’
почему не может посчитать?

Alexander
10.10.2018
07:33:52
в расте не в рантаймк
Тут важно то, что у раста ещё и гц нет. А если захочется его прикрутить к чему-то, то надо явно передавать владение чем-то гц.

Alexander
10.10.2018
07:35:45
угу

kana
10.10.2018
07:36:09
Couldn't match type ‘n + 2’ with ‘(n + 1) + 1’
как и 2 + n with 1 + (1 + n)

Alexander
10.10.2018
07:43:15
там плагины надо или аскиомы через unsafeCoercr

Ilya
10.10.2018
07:45:25
попробуйте import Prelude
> :m Prelude
<no location info>: error:
Ambiguous module name ‘Prelude’:
it was found in multiple packages: base-4.11.1.0 summoner-1.1.0.1
Хм, возможно, дело в том, что ghci сам не смог разрешить эту неопределенность. Но stack ghci может.
Дальше я сделал так:
$ ghc-pkg unregister summoner
ignoring (possibly broken) abi-depends field for packages
После чего ghci заработал, как ожидается.
Но такие конфликты могут, наверное, возникнуть и в будущем. Возможно ли их избежать превентивно?

kana
10.10.2018
07:45:45
в принципе это не нужно, достаточно просто добавить еще один фантом
https://gist.github.com/kana-sama/20086dacb9a29bd10b041660a166d6f9
теперь рефы не убегут из скоупа (вниз тоже), и все новые рефы имеют уникальный айди

Aleksey
10.10.2018
07:49:06
А ещё стоит зарепортить баг, потому как пакеты, экспортирующие неймспейс Prelude, это моветон

Yuriy
10.10.2018
07:50:51