
Alexander
04.10.2018
15:17:49
вот вне STM нормальных каналов нет
(B)Queue норм, а каналы плохие

∀
04.10.2018
15:18:30

Alexander
04.10.2018
15:18:40
возможно..

Google

Александр
04.10.2018
15:18:50

Alexander
04.10.2018
15:19:03
это stm-containers?
я чего-то ими никогда не пользовался и мне либа сильно не понравилсь

Александр
04.10.2018
15:19:27
Не, прям в stm

Alexander
04.10.2018
15:20:23
newtype TArray i e = TArray (Array i (TVar e)) deriving (Eq, Typeable) <-
ну такое..
fixed size массив с возможными error вместо TVar
мне не приходилось использовать его

Александр
04.10.2018
15:21:16
Там написано "вы можете сделать свою, более эффектинвую реализацию Array для STM"
Я не очень понимаю, что с ним делать, с таким массивом

Alexander
04.10.2018
15:22:36
ну если у тебя есть пачка переменных STM которых можно индексировать то может и норм

∀
04.10.2018
15:28:44
мы ж задачи не знаем
Задача у меня - обёртка для 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"

Александр
04.10.2018
15:29:53
Звучит классно!

∀
04.10.2018
15:31:36
Оно уже написано (год назад), но в настолько плохом стиле, что лучше я не будут пока публиковать. К тому же без асинхронности плагинов это практически бесполезная вещь.

Google

Victor
04.10.2018
15:45:55
плохость стиля не повод не публиковать. надо публиковать, чтоб оценить насколько функциональность удобна/востребована

Alexander
04.10.2018
15:50:47
@cblp_su а crdl для динамических таблиц существует?
где динамическая значит что можно менять столбцы и строки местами добавлять и удалять
прсото если для обычного текста есть, то тут наверное так же можно?

Yuriy
04.10.2018
15:51:31

Alexander
04.10.2018
15:51:39
crdt представление
cdrt?

Yuriy
04.10.2018
15:53:00
именно для таблиц не встречал, могу поискать. навскидку — для текста применяется любой из sequence типов, таблицу можно представить как sequence (sequence a)
если ячейки не перемещаются, то LWW-словарик, где в качестве ключей индексы в таблице
type Table a = RGA (RGA a)
type RgaString = RGA Char
type MyTable = Table RgaString
а с какой целью интересуешься?

Alexander
04.10.2018
15:59:46
думаю можно ли чтото более лучшее с alphasheets сдлелать чем там есть

Yuriy
04.10.2018
16:03:20

Alexander
04.10.2018
16:03:37
не
я ж и так на них работаю

Yuriy
04.10.2018
16:04:20
ну, не себя продать, а ещё одну фичу?

Alexander
04.10.2018
16:04:34
типа того
если это сохранит моё sanity

∀
04.10.2018
17:14:51

Google

Victor
04.10.2018
17:17:30
Спасибо, посмотрю вечером

∀
04.10.2018
18:26:46
Библиотека как раз для такого способа использования мультитрединга, как мне было нужно.
https://hackage.haskell.org/package/auto-update-0.1.4/docs/Control-AutoUpdate.html

Igor
04.10.2018
18:28:02

Vladimir
04.10.2018
18:28:48

Евгений
04.10.2018
19:46:22
... от автора real world haskell. Лаконичные, без особой воды.
CS240h Lecture slides
http://www.scs.stanford.edu/16wi-cs240h/slides/

Artem
04.10.2018
19:51:34
Ребят, извините, не совсем понял, как мне поможет coerce, если я делаю не T a -> T b, а хочу сделать T a -> a?

Alexander
04.10.2018
19:51:59
если T это newtype то поможет
coerce :: Coercible * a b => a -> b
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
04.10.2018
19:53:46
Окей, спасибо)
А что за * в нотации типа?

Alexander
04.10.2018
19:54:31
то что раньше было kind
там скорее всего указано что a и b из star, но haddock тупит

Artem
04.10.2018
19:55:18
Понял, еще раз спасибо)

Alexander
04.10.2018
19:56:42

Artem
04.10.2018
20:04:44
А как вот такой функции задать тип правильно:
unwrapAndStringify :: (Coercible a b, Show b) => a -> String
unwrapAndStringify = show . coerce
Мне же нужно указать, что a это конструктор

Alexander
04.10.2018
20:08:10
не понял
а тут это любой тип, который может быть переведен в b
такое правда только с TypeApplications используешь. т.к. b не выводится

Google

A64m
04.10.2018
20:12:17
unwrapAndStringify :: forall a b. (Coercible a b, Show b) => a -> String
unwrapAndStringify = show @b . coerce
что-то вроде такого, наверное

Artem
04.10.2018
20:14:44
Говорит, что тип b вне контекста

Alexander
04.10.2018
20:15:23
я думаю нужно будет extenstion чт попросят сделать

A64m
04.10.2018
20:15:25
ScopedTypeVariables

Alexander
04.10.2018
20:15:36
и там где применяется unwrapAndStringify тоже
@ X делать

A64m
04.10.2018
20:16:25
да, и еще тогда b и a местами поменять после форолл
чтоб @_ @КЧемуКастим не писать

Alexander
04.10.2018
20:17:41
да
но проще писать show @Internal . coerce

Artem
04.10.2018
20:19:19
Только в обоих случаях:
Not in scope: type variable ‘b’ |48 | unwrapAndStringify = show @b . coerce |

A64m
04.10.2018
20:23:04
> 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
04.10.2018
20:23:21
{-# 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))
это работает в ghci
ахахаха
блин почти 1 в 1 написали

Artem
04.10.2018
20:23:55
Оу
Я потерял ScopedTypeVariables
А есть какие-то хаки, что бы везде не писать теперь unwrapAndStringify @CAST_TYPE ...?

Google

A64m
04.10.2018
20:26:56
так ему неоткуда узнать к какому типу кастить иначе
если бы возвращаемый тип бвл тот к которому кастить, не понадобилось бы аннотировать
все зло от show

Alexander
04.10.2018
20:28:58
ну или не coerce я что-то из generic-lens/lens использовать

A64m
04.10.2018
20:29:05
но его тоже можно взять из парметра функции, которая unwrapAndStringify использует

Artem
04.10.2018
20:30:30
chatId' = unwrapAndStringify @ChatId ...
Error: Couldn't match representation of type ‘b0’ with that of ‘Integer’ arising from a use of ‘unwrapAndStringify’

A64m
04.10.2018
20:30:54

Alexander
04.10.2018
20:32:11
контекст
Всем привет.
Есть ли в Haskell способ сделать деструктуризацию значения из конструктора полиморфно?
Хотелось бы вместо этого:
chatId' = (\(ChatId id) -> show id) . chatId . messageChat <$> mСделать что-то вроде этого:
chatId' = show . UNPACK_CONSTRUCTOR_FN . chatId . messageChat <$> m
@js_monk chatId' = show @Integer . coerce .charId . messageChat <$> m не работает?

Artem
04.10.2018
20:34:03
Так работает

Alexander
04.10.2018
20:34:12
отлчино

Artem
04.10.2018
20:34:29
Спасибо большое :3

Alexander
04.10.2018
20:34:49
ты выше просишь привести к @ChatId
в то время как по условию задачи ты хотел наоборот к распакованному значению
с type applications понимаешь как работает

Artem
04.10.2018
20:37:12
Не особо

Alexander
04.10.2018
20:38:45
надо рассказывать?