Alexander
просто я сказал, что возможно стоит подумать в сторону где тред уведовляет об изменениях через канал
Alexander
мониторящий тред смотрит канал если надо и что-то делает
Alexander
В STM каналы тоже есть, ага
Alexander
и очереди!
Alexander
вот вне STM нормальных каналов нет
Alexander
(B)Queue норм, а каналы плохие
Vladimir
Alexander
возможно..
Alexander
это stm-containers?
Alexander
я чего-то ими никогда не пользовался и мне либа сильно не понравилсь
Alexander
Не, прям в stm
Alexander
newtype TArray i e = TArray (Array i (TVar e)) deriving (Eq, Typeable) <-
Alexander
ну такое..
Alexander
fixed size массив с возможными error вместо TVar
Alexander
мне не приходилось использовать его
Alexander
Там написано "вы можете сделать свою, более эффектинвую реализацию Array для STM"
Я не очень понимаю, что с ним делать, с таким массивом
Alexander
ну если у тебя есть пачка переменных STM которых можно индексировать то может и норм
Vladimir
мы ж задачи не знаем
Задача у меня - обёртка для dzen, типа [1], только гораздо круче. Фреймворк для создания интерактивных UI.
Он будет спавнить dzen и слушать его stdout - так можно реагировать на пользовательские события. Плюс к этому, тип данных, генерируемых плагинами (которые будут представлены любым IO), будет не Text, а AST, соответствующее DSL dzen[2]. И над этим AST можно выполнять преобразования. Анимации делать, раскрашивать, вот это всё - до того, как оно попадает на вход dzen.
[1]. https://hackage.haskell.org/package/dzen-utils
[2] https://github.com/robm/dzen
См. "In-text formating & control language"
Alexander
Звучит классно!
Vladimir
Оно уже написано (год назад), но в настолько плохом стиле, что лучше я не будут пока публиковать. К тому же без асинхронности плагинов это практически бесполезная вещь.
Anonymous
плохость стиля не повод не публиковать. надо публиковать, чтоб оценить насколько функциональность удобна/востребована
Alexander
@cblp_su а crdl для динамических таблиц существует?
Alexander
где динамическая значит что можно менять столбцы и строки местами добавлять и удалять
Alexander
прсото если для обычного текста есть, то тут наверное так же можно?
Cheese
Alexander
crdt представление
Alexander
cdrt?
Cheese
именно для таблиц не встречал, могу поискать. навскидку — для текста применяется любой из sequence типов, таблицу можно представить как sequence (sequence a)
Cheese
если ячейки не перемещаются, то LWW-словарик, где в качестве ключей индексы в таблице
Cheese
Cheese
type Table a = RGA (RGA a)
type RgaString = RGA Char
type MyTable = Table RgaString
Cheese
а с какой целью интересуешься?
Alexander
думаю можно ли чтото более лучшее с alphasheets сдлелать чем там есть
Cheese
Alexander
не
Alexander
я ж и так на них работаю
Cheese
ну, не себя продать, а ещё одну фичу?
Alexander
типа того
Alexander
если это сохранит моё sanity
Anonymous
Спасибо, посмотрю вечером
Vladimir
Библиотека как раз для такого способа использования мультитрединга, как мне было нужно.
https://hackage.haskell.org/package/auto-update-0.1.4/docs/Control-AutoUpdate.html
Владимир
Евгений (Владимирович)
Евгений (Владимирович)
... от автора real world haskell. Лаконичные, без особой воды.
Евгений (Владимирович)
CS240h Lecture slides
http://www.scs.stanford.edu/16wi-cs240h/slides/
Artem
Ребят, извините, не совсем понял, как мне поможет coerce, если я делаю не T a -> T b, а хочу сделать T a -> a?
Alexander
если T это newtype то поможет
Alexander
coerce :: Coercible * a b => a -> b
Alexander
This two-parameter class has instances for types a and b if the compiler can infer that they have the same representation. This class does not have regular instances; instead they are created on-the-fly during type-checking. Trying to manually declare an instance of Coercible is an error.
Nevertheless one can pretend that the following three kinds of instances exist.
Artem
Окей, спасибо)
А что за * в нотации типа?
Alexander
то что раньше было kind
Alexander
там скорее всего указано что a и b из star, но haddock тупит
Artem
Понял, еще раз спасибо)
Alexander
Artem
А как вот такой функции задать тип правильно:
unwrapAndStringify :: (Coercible a b, Show b) => a -> String
unwrapAndStringify = show . coerce
Мне же нужно указать, что a это конструктор
Alexander
не понял
Alexander
а тут это любой тип, который может быть переведен в b
Alexander
такое правда только с TypeApplications используешь. т.к. b не выводится
A64m
unwrapAndStringify :: forall a b. (Coercible a b, Show b) => a -> String
unwrapAndStringify = show @b . coerce
A64m
что-то вроде такого, наверное
Artem
Говорит, что тип b вне контекста
Alexander
я думаю нужно будет extenstion чт попросят сделать
A64m
ScopedTypeVariables
Alexander
и там где применяется unwrapAndStringify тоже
Alexander
@ X делать
A64m
да, и еще тогда b и a местами поменять после форолл
A64m
чтоб @_ @КЧемуКастим не писать
Alexander
да
Alexander
но проще писать show @Internal . coerce
Artem
Только в обоих случаях:
Not in scope: type variable ‘b’ |48 | unwrapAndStringify = show @b . coerce |
A64m
> import Data.Coerce
> :set -XScopedTypeVariables
> :set -XTypeApplications
> :set -XAllowAmbiguousTypes
> :{
| foo :: forall b a. (Coercible a b, Show b) => a -> String
| foo = show @b . coerce
| :}
> import Data.Monoid
> foo @Integer $ Sum 24
"24"
Alexander
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
import Data.Coerce
import Data.Monoid
unwrapAndStringify :: forall b a. (Coercible a b, Show b) => a -> String
unwrapAndStringify = show @b . coerce
test = unwrapAndStringify @Int (Sum (5::Int))
Alexander
это работает в ghci
Alexander
ахахаха
Alexander
блин почти 1 в 1 написали
Artem
Оу
Artem
Я потерял ScopedTypeVariables