Size: a a a

Elm Lang сообщество разработчиков

2019 June 27

AK

Anton Komissarov in Elm Lang сообщество разработчиков
даже в нашем случае, в идеале вместо стринг был бы Time.Posix
источник

AK

Anton Komissarov in Elm Lang сообщество разработчиков
но к сожалению, приходиться делать обходы
источник

AK

Anton Komissarov in Elm Lang сообщество разработчиков
короче, мой месседж в том, что opaque type/ smart constructors это тема если можно в них заточить бизнес логику(особенно когда её через край много)
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Но предположим, что стало можно. Тогда можно было бы сделать так
type SelectedKey = ... -- этот тип нельзя сконструировать
type RestKey = ...     -- а этот - можно

type Cart = Cart { selected : SelectedKey, rest : Dict RestKey v}


и останется сделать функцию

select
 : RestKey
 -> Dict RestKey v
 -> (SelectedKey, v, Dict RestKey v)


а конструктор Cart можно будет не прятать
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Тут "непрозрачна" только функция изымания из словаря. Она же порождает SelectedKey, который никаким другим способом получить нельзя.
источник

AK

Anton Komissarov in Elm Lang сообщество разработчиков
в нашем случае нужно. так как когда меняется "rest" должнен так же поменяться "selected"
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
select это и сделает
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Он возвращает новый словарь и новый selected
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Можно ещё сделать непрозрачным RestKey, тогда извлесь из словаря можно будет только через select. Только нужно будет сигнатуру поменять:

select
 : Int   -- это внешний ключ
 -> Dict RestKey v
 -> (SelectedKey, v, Dict RestKey v)
источник

AK

Anton Komissarov in Elm Lang сообщество разработчиков
не могу родить как в данном случае selected связан с Dict
источник

AK

Anton Komissarov in Elm Lang сообщество разработчиков
вот мне так понятно type Cart = Cart { selected : ( SelectedKey,  v ) , rest : Dict SelectedKey v}
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Как сконструировать RestKey (из Int), знает только select. А значит изменить словарь извне не получится — нечем конструировать ключи
источник

AK

Anton Komissarov in Elm Lang сообщество разработчиков
ааа
источник

AK

Anton Komissarov in Elm Lang сообщество разработчиков
умно
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
И SelectedKey тоже никак не получить, кроме как через selected
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Который проследит, что dict поменялся
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
При такой архитектуре скрывать нужно сильно меньшую часть. Сам Cart полностью прозрачен
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
И Dict тоже можно использовать обычными способами (кроме модификации)
источник

AP

Aleksei (astynax) Pirogov in Elm Lang сообщество разработчиков
Если захочется, скажем, распечатать значения словаря (даже с ключами, если для них будет доступна функция RestKey -> smth), то никаких проблем!
источник

AK

Anton Komissarov in Elm Lang сообщество разработчиков
осталось дождаться когда в Dict для ключей можно будет свои типы засунуть
источник