Denis
Т.е. дайте мне фронт писать, я его буду точно как бэкенд. Дайте FRP, дайте больше детерминизма. Взять purscript или urweb и в бой.
Alexander
Alexander
Во фронтенде очень много проблем с UX, но самой большой проблемой мне видится, что эти проблемы с UX не замечают. Вот зачем придумали мобильные версии сайта, если ими пользоваться невозможно
Alexander
поскольку во фронтенде такого нету - то значит форма меняется всегда
Denis
Oleg
Alexander
binode
Alexander
кстати так дивергентненько
Leo
Leo
а каждый квартал браузер будут ломать потому что оптимизация
Leo
либо безопасность
Дмитрий
Так, ещё раз просмотрел в код... я по прежнему в непонятках... как может остаться не до конца открытое соединение, если поток упал с исключением ConnectionClosed????
Дмитрий
Щ.щ
Алексей
Alexander
Denis
либо безопасность
Количество неконтроллируемого ада никак не влияет на подходы, которые можно использовать.
Leonid 🦇
Дмитрий
Leonid 🦇
Я вот пишу UX на совсем сомнительном ЯП (c++/Qt) и как-то со скрипом но налазит задача на недотипы.
Дмитрий
Это если локально, нелокально та же петрушка.
Alexander
ох
Denis
Alexander
это с wai/warp?
Дмитрий
Это с вебсокет.
Alexander
а его закрывают потом? sClose
Дмитрий
его закрывают close
Anonymous
Включай С++17
Alexander
он точно вызывается?
Дмитрий
finally
Alexander
страннота
Anonymous
Ну вот
Дмитрий
Ага, я уже и в библиотечный код глянул и себе его кусок передрал, и та же петрушка.
Дмитрий
https://www.stackage.org/haddock/lts-10.7/websockets-0.12.3.1/src/Network.WebSockets.Client.html#runClientWith
Дмитрий
res <- finally
(S.connect sock (S.addrAddress addr) »
runClientWithSocket sock fullHost path opts customHeaders app)
(S.close sock)
Дмитрий
Должно оно закрываться 😢
parket
Тут недавно обсуждали Records vs TypeClasses.
Это было про вот это?
http://www.haskellforall.com/2012/05/scrap-your-type-classes.html
кана
Да
Alexander
Alexander
это же тот который слушаем
Alexander
на каждый коннект мы создаем сокет отдаем его в application
Alexander
насколько я помню runClientWithSocket не следит за ними
Дмитрий
Не следит?
Дмитрий
(ушёл в код)
Alexander
не должен, ты ж сам там потоки и т.п. можешь плодить вроде
Alexander
(я не до конца уверен)
Дмитрий
Ну вот я вижу создание сокета...
Дмитрий
sock <- S.socket (S.addrFamily addr) S.Stream S.defaultProtocol
Дмитрий
А вот его закрытие
Дмитрий
(S.close sock)
Дмитрий
А runClientWithStream действительно не следит, но он внутрянняя функция.
Дмитрий
для runClientWith
Дмитрий
Собственно вот сокета судьба
sock <- S.socket (S.addrFamily addr) S.Stream S.defaultProtocol
S.setSocketOption sock S.NoDelay 1
— Connect WebSocket and run client
res <- finally
(S.connect sock (S.addrAddress addr) »
runClientWithSocket sock fullHost path opts customHeaders app)
(S.close sock)
Дмитрий
От создания до смерти.
Leonid 🦇
я бы вставил (putStrLn "closed" *> S.close sock)
Leonid 🦇
ну мало ли
Дмитрий
Сейчас...
Leonid 🦇
а так конечно и OS может мутить
Дмитрий
Тестили локально, на реальных машинах и на виртуалках.
Дмитрий
Одна фигня.
Alexander
так а как повторить
Alexander
у нас websocket активно используется но такого не видел
parket
С помощью TypeClass мы реализуем adHoc-полиморфизм, так?
Дмитрий
Хм, интересный вопрос. Я попробую собрать минимальный пример этой гадости.
Denis
Дмитрий
Только не закрылось нифига.
parket
Тогда вопрос касательно Elm. Мы умеем в параметрический полиморфизм, но не умеем в adHoc. Но ссылаясь на статью Гонзалеса "Scrap your type classes" мы можем реализовать adHoc на рекордах, так?
parket
Denis
Denis
haskell весь heavy lifting за программиста делает
Denis
а так конечно путь сраданий длинен и тернист
Denis
тайпчекает - находит инстанс, по нему выбирает словарик, подставляет его
Denis
в Core уже явно словари таскаются
Aleksei (astynax)
parket
Ага, интересно. Процитирую отсюда:
https://softwareengineering.stackexchange.com/questions/261788/proper-use-of-typeclasses
Addendum: a "record of methods" (or "instance dictionary" as it's often called) is actually what Haskell uses to implement type classes under the rug. Such an approach would be something like:
data Displayable d = Displayable
{ display :: d
, toPicture :: d -> Picture
, getDims :: d -> (Float, Float)
, getPos :: d -> (Float, Float)
, getScale :: d -> Float
, setDims :: (Float,Float) -> d -> d
, setPos :: (Float,Float) -> d -> d
, setScale :: Float -> d -> d
}
Any type class can be transformed into this form: this a literal translation of the type class in your question. You probably don't want to use in this exact form though: it's best if you can figure out which parts of Displayable really needs to be abstract, and which parts you can make concrete. Too much flexibility can make the code more complex than it needs to be.