Cheese
попробуйте import Prelude
Cheese
:load вообще для другого
:load загружает файлы-модули, а не модули из пакетов. для модулей из пакетов есть import и :module
Д.
stack идет вместе с Haskell Platform. Ставится автоматически со вторым вместе
Д.
Лучше было отдельно не ставить
Ilya
Лучше было отдельно не ставить
Это верно. Ставил сначала просто платформу погонять, но потом stack понадобился. >для модулей из пакетов есть import и :module Попробую завтра, на этом пк такая ошибка не воспроизводится, спасибо
A64m
новая эра продлилась недолго https://github.com/ghc/ghc/commit/d728c3c578cc9e9205def2c1e96934487b364b7b
a66ath
Как нет регистров?
a66ath
Собрал таки свой проект
a66ath
Завендорил телеграм апи
кана
{-# 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
Это по мотивам blah?
кана
да
Oleg
Что-то вроде линейщины вряд ли получится. Для этого нужно иметь по паре контекстов-индексов и уметь их сплиттить /склеивать
Oleg
Хотя может и одного хватит
Oleg
https://gist.github.com/kana-sama/2134f4b1793422865284fbd2c063a5df
Ну и максимум здесь неверный подход. Если из индеса будет удалена последняя переменная, а ссылку на неё припрячут. То после выделения новой переменной, можно будет незаконно использовать припрятанную, ведь номера у них будут одинаковые. Нужен монотонно инкрементируемый счётчик
Alexander
Что это? Для чего?
Alexander
Почему на тайп левеле?
Oleg
Ну вот надо не только писать в blah но и иногда читать его
Alexander
Среди вашего флуда про квантмех трудно найти что-то полезное
Oleg
Ну вот как раз после них
Oleg
Исходные рассуждения Вершилова и А64 были про компакты, которые можно транспортить, не копируя, если известно, что ссылок на них нет. Я что-то вбросил про Идрис и Вершилов сказал, что можно и индексед монадкой справиться
Alexander
А, ясно, академщина
Oleg
Ну как, рассуждения (не мои) были по мотивам продового перфоманса
Oleg
Не знаю, какая тут академщина. Жиза
a66ath
hie не умеет в new-build
a66ath
Но мне это и не нужно, буду как кметт, ручками все писать
Alexander
поидее там нужно что-то вроде RankN не знаю как правильно сработает попозже попытаюсь сделать (но это не точно)
Alexander
@graninas суть простая, в расте можно добиться большей безопасности работы с ресурсами и убрать use after frwet
Alexander
free
Alexander
а у нас можно только регионами, которые не позволяют early free, которые (апстримовые) не работают с конкурентностью
Alexander
Ну, я такое могу сделать тоже. На фри монадах, ясное дело
Alexander
вопрос в том можно ли в текущем сеттинге добиться похожего в сабже
Alexander
не можешь конечно
Alexander
Могу
Alexander
как у них с rank2?
Alexander
rankn
Alexander
без них ты не сможешь сделать защиту на typelevel
Alexander
и тебе нужны будут индексированные монадки
Alexander
Зачем на тайп левеле? Достаточно в рантайме
Alexander
нет
Alexander
в рантайме любой дурак может завернув ресурс в мварь
Alexander
без прямого доступа
Alexander
Почему нет? Зачем усложнять? Во всех промышленных языках в рантайме делается
Alexander
я вроде начал с описания ситуации?
Alexander
Мварь тоже помодет, да
Alexander
в расте не в рантаймк
Alexander
Ну и молодец, rust. Хорошо придумал
Alexander
да, там линейные типы хорошо легли
Alexander
Ну хорошо, если будет в Хаскеле. Но если надо ехать, а не шашечки, то просто надо брать и использовать кондовые практики. Они, по крайней мере, всем знакомы, и их accidental complexity не высокая.
a66ath
fizruk здесь есть?
Anatolii
он быстрее в gitter ответит
Anatolii
я его там находил
кана
{-# 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
кана
если спрятать и получится, то использовать - нет, но только в пределах одного блока, нужно 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
угу
кана
Couldn't match type ‘n + 2’ with ‘(n + 1) + 1’ как и 2 + n with 1 + (1 + n)
кана
вообще плохо чет работает все с неизвестной n
Alexander
там плагины надо или аскиомы через unsafeCoercr
Ilya
попробуйте 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 заработал, как ожидается. Но такие конфликты могут, наверное, возникнуть и в будущем. Возможно ли их избежать превентивно?
кана
в принципе это не нужно, достаточно просто добавить еще один фантом
кана
https://gist.github.com/kana-sama/20086dacb9a29bd10b041660a166d6f9
кана
теперь рефы не убегут из скоупа (вниз тоже), и все новые рефы имеют уникальный айди
Aleksei (astynax)
А ещё стоит зарепортить баг, потому как пакеты, экспортирующие неймспейс Prelude, это моветон
Aleksei (astynax)
Aleksei (astynax)
Так и есть. Экспортирует Prelude
Aleksei (astynax)
Не надо так
Alexander
кажется с @chshersh был недавно разговор по этому поводу
Aleksei (astynax)
Вообще это интересный вопрос - как поиметь в проекте свою Prelude (+ base без оригинальной) и не сломать ничего тем, кто потом отдепендится от пакета проекта и от оригинальной base (c искоробочной прелюдией)
кана
https://github.com/kowainik/relude#base-noprelude
кана
вот тут он поясняет подход про свой Prelude