Алексей
Зачем сразу линейными типами пугать?
Alexander
для всего есть от низкоуровневых методов до весьма выскокоуровневого описания
Alexander
там ещё 3 других пункта
Alexander
может человек из мира clean и ему станет тут тепло и уютно
Кабачок
в клине есть переменные?
a66ath
Из мира клин с такими вопросами?
Алексей
Не станет. Линейные типы же ещё не сделаны
Andrey
в клине кинотеатр дешевый, был в нем в 2006
Andrey
а так я из мира мобильной разработки. нам тут свифт подогнали который умеет в функцию принимать функцию и возвращать другую функцию. вот и разбираюсь с тем как оно все работает
Andrey
дмитрий, насчет отмены функции. я правильно вас понял что речь идет о каком-то "ссылочном" параметре который проверяется внутри функции на каждом шаге чтобы проверить "отменяться или продолжать работать"?
Alexander
остановку операции нужно точно в язык смотреть и его средства
Alexander
т.к. в haskell это асинхронные исключения
Alexander
я не уверен, что они есть в swift
Andrey
т.е. какой-то парадигменной/общей концепции не предусмотрено?
Alexander
ФП-wide?
Andrey
тип того
Alexander
нет, конечно, как и в императивном мире
Alexander
на самом низком уровне это проверка некой переменной, но делает ли это за тебя ядро, когда прилетит сигнал, или ты должен сам, и вообще, что такое "тред" это очень изменчивое понятие
Alexander
зависит как он рантайма языка/операционной системы так и от того, что выполняется
Alexander
чем жирнее рантайм тем более высокий уровень есть, в haskell с STM и грин тредами, ртс делает само
Andrey
да, разные фреймворки есть. "промисы" отменяются, в "эрыксе" отписываются, а в голом "тру-ооп" проверяют "isCancelled" когда надо
Alexander
isCancelled это не трЪ-ооп
Alexander
это старое добрые языки с очень тощей rts
Alexander
точнее без неё
Alexander
где треды системные и нету io, thread менеджеров и т.п.
Alexander
и то там можно при желании пульнуть в тред сигналом
Alexander
если OS поддерживает
Alexander
и в его хендлере все проверить и решить, что дальше
Alexander
опять же можно сделать handle/eventfd и послать туда сообщение, чтобы тред увидел и сделал нужное действие
Alexander
без проверки isCancelled
Alexander
вариантов уйма со своими плюсами и минусами
Alexander
высокоуровневые варианты, типа отмены промиса, строятся поверх того, что выше
Alexander
грубо говоря, для языков, где thread == OS thread обычно не предоставляется высокоуровневого решения
Alexander
и ты сам делаешь через переменные, сигналы, fd, другой примитив OS позволяющий нотификации
Alexander
причина в том, что там обычно высокоуровневое решение слишком дорогое
Alexander
языки где треды зеленые, или есть горутины, промисы и прочие звери не маппящиеся явно на OS треды, есть другие решения
Alexander
тут надо смотреть на конкретный язык
Alexander
ответ для haskell на 90% не подойдет как ответ для swift
Alexander
https://stackoverflow.com/questions/25850867/how-to-cancel-one-of-many-threads-in-swift?rq=1
Alexander
вот что пишут про последний
Alexander
в Haskell за тебя это делает RTS
Alexander
асинхронное исключение это регистрация исключения к контекте потока, когда поток приходит в safe point он проверяет прилетело ли исключение и если да. то переходит к его обработке
Alexander
(очень грубо говоря)
Alexander
т.е. isCancelled но написанный а. за тебя б. так что это хорошо композится в. достаточно эффективно
Alexander
т.е. тебе не нужно думать о том, будет ли твоя функция работать в отменяемом контексте или нет
Alexander
как-то так
Alexander
могу ещё такую же стену про стейт выдасть, но там уже есть общие решения
Alexander
т.к. хранение стейта не зависит от системы исполнения так сильно
Andrey
да, спасибо. я вроде понял кое-что. в свифте есть операции (которые по ссылке), но это не про потоки. сами операции это обертка, которая дает возможность превратить какие-то куски кода (которые что-то делают) в объект. т.е. мы создаем операцию (у нее создается внутренний контекст с параметрами), далее помещаем операцию в очередь и все. очередь сама вызовет у операции "main". т.е. операция это pure sideeffect). внутри операций лежит GCD. он позволяет просто в потоке вызвать любой void кусок кода. тоже по сути сайдэффект. самый распространенный паттерн это передавать внутрь completioncallback (тоже void кусок кода который вызовется с нужными нам параметрами). по большому счету это все что можно рассказать про асинхронность на свифте) остальное нюансы
Andrey
начал просто писать апи только на функциях. сделал "пайплайн", сделал дженерики которые из нескольких функций получают значения и пихают их в одну для вычислений. и вроде как все здорово работает, но вот вспомнил про то что мне придется уметь отменять все это на любом моменте. причем сама отмена тоже должна быть асинхронной (разрабатываю блютузное апи, там очередность операций жесткая, если я отменю выполнение одной функции и не дождусь ее окончания то пакеты данных могут перемешаться). и похоже придется делать промисы, т.к. красиво отмену наверное не сделать
Alexander
это на #swift
Alexander
отмена операций это очень зависимая от языка вещь
Alexander
если в той очереди, куда ты помещаешь, нету специального api для этого
Andrey
ну да, ответы я получил. мне было интересно как эти задачи решаются в функциональных языках. всем спасибо!
Alexander
про стейт тоже все ясно?
Andrey
про стейт нашел такую статью https://habrahabr.ru/post/184722/
Andrey
магия заключается в get и put?
Alexander
магии нету..
Alexander
грубо говоря state это функция s -> a -> (s,a)
Alexander
точнее нет
Alexander
s -> (s,a)
Alexander
она берёт параметром состояние и возвращает пару состояние и значение
Alexander
ну и плюс возможные эффекты, но в свифте вроде никакого контроля за этим нету
Andrey
а 'a' это какое значение?
Alexander
значение возвращаемое функцей, да
Alexander
State s a
Alexander
такие штуки можно объединять в пайплайн
Alexander
но грубо говоря это как я писал сначала "хранение стейта в параметре функции"
Alexander
в haskell и многом фп с этим удобно работать, будет ли это удобно в swift если не переизобретать Monad с толковым API я не знаю
Alexander
но вроде в некоторых языках интерфейс портируют, и вроде пользуют
Mi Shа
Привет! Где-то есть такая фича, чтобы в редакторе за пару кликов сгенерировать сигнатуру для функции?
Anonymous
К уже имеющейся или стаб для функции, которую ты собираешься писать?
Для уже написанной я обычно делаю :t fooBar в ghci
Aleksei (astynax)
intero как раз :t и делает :)
Aleksei (astynax)
Ну тогда intero - я тоже его пользую :)
Mi Shа
Почему (**) :: Floating a ? Разве нельзя возвести 2 во вторую степень?
Dmitry
λ> :t (^)
(^) :: (Integral b, Num a) => a -> b -> a
λ>
Mi Shа
Все, нагуглил.
Mi Shа
Спасибо
Mi Shа
Подскажите, пожалуйста, как лучше пройтись по списку, отнять от каждого элемента 2, а потом возвести во вторую степень? map (((^) 2) . (subtract 2)) [0..2] выбрасывает исключение Negative exponent. Нужно сделать flip на (^) ?
Aleksei (astynax)
Зачем скобки вокруг ^?