@kotlin_lang

Страница 936 из 982
Денис
09.10.2018
11:30:11
(я всё к тому, что получился ну какой-то супербессвязный набор слов, ну да ладно)

Отправка автора в рид-онли на сутки вошла во второй раунд

Andrew
09.10.2018
11:30:32
Но с неожиданным витком — заговорили о continue / break.

Nick
09.10.2018
11:36:13
Подскажите, можно ли как-то прочекать в геттере переменной её значение не уходя в рекурсию?

Google
Alexandr
09.10.2018
11:36:32
мдэ...

Alexander
09.10.2018
11:37:25
Удивительно. Отловил ошибку. Пишу lu[row, col] /= luDiag - ошибка генерации байт-кода, пишу lu[row, col] = lu[row, col] / luDiag - работает. Все тут: https://youtrack.jetbrains.com/issue/KT-27469

Nick
09.10.2018
11:38:53
спецпеременная с именем field
И если у меня переменная null, то в field получается тоже будет null?

Beholder
09.10.2018
11:39:17
а то!

Nick
09.10.2018
11:39:31
Найс, спасибо

dimiii
09.10.2018
11:44:56
Удивительно. Отловил ошибку. Пишу lu[row, col] /= luDiag - ошибка генерации байт-кода, пишу lu[row, col] = lu[row, col] / luDiag - работает. Все тут: https://youtrack.jetbrains.com/issue/KT-27469
Все хочу спросить, как вообще линейная алгебра пишется на котлине? Не много ли теряется в производительности? В том же lapack люди угорают по пространственной и временной оптимизации кэша, loop tiling, интринсикам для векторных инструкций итп оптимизациям. Есть смысл, кроме фана?

Beholder
09.10.2018
11:45:45
на ассемблере завсегда быстрее

Alexander
09.10.2018
11:51:55
Все хочу спросить, как вообще линейная алгебра пишется на котлине? Не много ли теряется в производительности? В том же lapack люди угорают по пространственной и временной оптимизации кэша, loop tiling, интринсикам для векторных инструкций итп оптимизациям. Есть смысл, кроме фана?
Ну никто не обязывает писать все на чистой котлине. Пишу дефолтную реализацию, чтобы работала везде, а потом будут платформные реализации, в том числе тот самый лапак, которые будут использвоаться на конкретной платформе при подключении конкретного модуля

Проблема с математическими либами в том, что нет общего интерфейса. Они все написаны во времена, когда было только процедурное программирование и про интерфейсы вообще слыхом не слыхивали

Google
Alexander
09.10.2018
11:59:58
Пример?

Руслан
09.10.2018
12:05:25
В котлине хвостовая рекурсия кастрированная: 1. Требует явно прописать tailrec 2. Не работает для взаимных хвостовых вызовов. В том виде, в котором она есть, практически малополезна.
Кто-то из ФП мира говорил что ему наоборот нравится этот кейворд т.к. он явно декларирует что тут будет оптимизация и компилятор проверит что она действительно возможна. И при этом при поддержке кода ее в этом месте не сломают.

Dmitry
09.10.2018
12:11:57
Всем привет! А кто корутинами пользуется? Вопрос такой - как мне оптимальнее с разных методов (например онклик на два разные кнопки) отменять действие, скажем, запроса - и посылать последнее изменение без предыдущих? Первый вариант который я накопал - это через job.cancel() - new Job() . Но я думаю есть что то более лучшее, никто не подскажет? Пример кода или ссылочку на почитать. Первый вариант: private var jobRequest = Job() fun someMethod1() { jobRequest.cancel() jobRequest = Job() launch(UI + jobRequest) { delay(3000) // do something 1 fun someMethod2() { jobRequest.cancel() jobRequest = Job() launch(UI + jobRequest) { delay(3000) // time msec // do something 2 } }

Alexander
09.10.2018
12:12:25
Странно. Функциональные ЯП в академической среде очень давно существуют.
Есть только С++, и там используются либы напрямую переписанные с фортрана один в один.

Alexey
09.10.2018
12:13:53
В котлине хвостовая рекурсия кастрированная: 1. Требует явно прописать tailrec 2. Не работает для взаимных хвостовых вызовов. В том виде, в котором она есть, практически малополезна.
Из-за виртуализации методов 2-ой пункт крайне сложно реализуем, разве что в кейсе с private final функциями, которые можно без зазрения совести убить на компайл тайме

Dmitry
09.10.2018
12:20:51
Жабра
09.10.2018
12:22:31
ты что то непонятное скинул, что это? )
Понятно, что класс будет другим, но реализация ± такая

Dmitry
09.10.2018
12:24:16
@Gabrodih ну то есть тоже по сути через new Job - job.cancel() ?

Жабра
09.10.2018
12:24:58
@Gabrodih ну то есть тоже по сути через new Job - job.cancel() ?
По сути да.) Но тут ещё для удобства можно переопределить coroutineContext

Все запущенные корутины в наследниках этого класса будут автоматически его использовать

Можно будет явно указать другой контекст

Но по дефолту Main

Dmitry
09.10.2018
12:25:56
@Gabrodih понятно. Прикольно. Я слышал еще способ через actor , но пока не смог разобраться как это может выглядеть

Google
Quantum Harmonizer
09.10.2018
12:45:19
а что за пляски с _view?
backing property называется

Nameless
09.10.2018
12:45:25
а зачем?

Quantum Harmonizer
09.10.2018
12:45:42
а зачем?
а как иначе?

Nameless
09.10.2018
12:46:04
а как иначе?
приватный сеттер чем хуже? какую проблему не решает?

Nameless
09.10.2018
12:48:21
nullability
да с этим беда

nullability
Можно обойтись через объект заглушку с интерфейсом View, поопрятнее будет имхо и ссылку на настоящий View не будем держать

Quantum Harmonizer
09.10.2018
12:54:09
Можно обойтись через объект заглушку с интерфейсом View, поопрятнее будет имхо и ссылку на настоящий View не будем держать
Пустую реализацию там держать? Чтобы при ошибке вместо крэша ничего не происходило?

Nameless
09.10.2018
12:54:32
Andrey
09.10.2018
13:23:03
Кто-то из ФП мира говорил что ему наоборот нравится этот кейворд т.к. он явно декларирует что тут будет оптимизация и компилятор проверит что она действительно возможна. И при этом при поддержке кода ее в этом месте не сломают.
Ну главная проблема - отсутствие оптимизации при взаимных хвостовых вызовах, а сам кейворд пожалуй даже хорош. Дополнительное ограничение декларирует. Хотя ничего он не декларирует. Вполне может быть функция, у которой только часть рекурсии хвостовая.

Руслан
09.10.2018
13:26:10
Аннотировать сам вызов разве что

Andrey
09.10.2018
13:28:00
А что в фп принято интерфесить ?
Ну в статически типизированном (Hindley–Milner based) ФП принято typeclass использовать. typeclass - тот же интерфейс, даже получше в плане функциональности.

Ну если совсем не станет хвостовой рекурсии tailrec скажет, не уверен как можно этот момент лучше сделать
Никак не улучшить особо. Просто убрать ключевое слово, раз уж оно гарантий не даёт, и пытаться оптимизировать все рекурсивные вызовы.

Alexey
09.10.2018
13:31:01
Я не говорил, что это легко реализовать. Я говорил, что без такой оптимизации tailrec малополезен.
Почему он мало полезен то? В голову не очень как раз приходят кейсы взаиморекрсии

Quantum Harmonizer
09.10.2018
13:31:09
Вот мне кажется, что это самое непопулярное ключевое слово. Проблема может возникнуть тогда, когда его сломают, а заметит только 1.5 человека. После релиза.

Руслан
09.10.2018
13:32:02
Andrey
09.10.2018
13:32:15
Почему он мало полезен то? В голову не очень как раз приходят кейсы взаиморекрсии
Реализация state machine на лямбдах, это если с ходу пример. Каждая лямбда кодирует одно из состояний, хвостовые вызовы - переход в другое состояние.

Google
Andrey
09.10.2018
13:33:48
Да и вообще как-то странно раздувать стек возврата хвостовыми вызовами.

Andrey
09.10.2018
13:36:44
Но... ведь... это и через одну функцию ок делается с tailrec
Ну любую взаимную хвостовую рекурсию можно развернуть в просто хвостовую, да и в цикл - тоже. Только читаемость хуже становится. Так-то можно трамплин написать, который сам это разворачивает, и на нём делать взаимную рекурсию.

Andrey
09.10.2018
13:38:23
Только всё одно, с трамплином немного более громоздко по коду получается, плюс хвостовые вызовы долгие будут и в куче будет много короткоживущих объектов.

В языке, в котором есть циклы, вообще можно отказаться от хвостовой рекурсии. Рекурсивными делать только вызовы не сводящиеся к хвостовым. Опять же, читаемость потеряется, так как вычисления будут "размазаны" по коду, который их организует, но принципиальных проблем нет. Вот в чистых ФП языках - да, без оптимизации никак. Там же кроме рекурсии нет других способов реализовать итеративные вычисления.

Костя
09.10.2018
13:51:37
Всем привет, подскажите момент с дженериками: есть такое наследование HouseCardAdapter : BaseCardAdapter<House> BaseCardAdapter<R : Realty> : ArrayAdapter<R> House : Realty и как мне описать глобальный филд adapter, когда пишу так var arrayAdapter : ArrayAdapter<Realty>, то при создании arrayAdapter = HouseCardAdapter() получаю compile-time error

вопрос как правильно описать глобальный филд, чтобы он работал с разными адаптерами

Admin
ERROR: S client not available

Костя
09.10.2018
13:53:19
в будущем будет LandCardAdapter : BaseCardAdapter<Land>

надо чтобы я могу инитить его и HouseCardAdapter и LandCardAdapter

Sergey
09.10.2018
13:54:16
https://twitter.com/kotlin/status/1049657568413540357/photo/1

Andrey
09.10.2018
13:57:21
Всем привет, подскажите момент с дженериками: есть такое наследование HouseCardAdapter : BaseCardAdapter<House> BaseCardAdapter<R : Realty> : ArrayAdapter<R> House : Realty и как мне описать глобальный филд adapter, когда пишу так var arrayAdapter : ArrayAdapter<Realty>, то при создании arrayAdapter = HouseCardAdapter() получаю compile-time error
У вас ArrayAdapter и BaseCardAdapter должны быть ковариантны по параметру R: interface Realty interface ArrayAdapter<out R> interface BaseCardAdapter<out R : Realty> : ArrayAdapter<R> class House: Realty class HouseCardAdapter : BaseCardAdapter<House> val fld: ArrayAdapter<Realty> = HouseCardAdapter()

Костя
09.10.2018
13:58:51
ну вообще всё так же

кроме out

но ошибка

Andrey
09.10.2018
13:59:04
Точнее даже не так. Достаточно, чтобы ArrayAdapter был ковариантен.

Ну так out и есть ковариантность

Google
Костя
09.10.2018
13:59:29
ArrayAdapter стандартный джавовский - андройдовский

похоже туда out не впилить

это не мой класс я от него только наследуюсь

Andrey
09.10.2018
13:59:59
Тогда никак. Дженерики инвариантны по умолчанию.

Костя
09.10.2018
14:00:25
эх..

придется что ли 2 переменные держать

Andrey
09.10.2018
14:00:38
Ну или val fld: ArrayAdapter<*> = HouseCardAdapter()

Костя
09.10.2018
14:01:06
так не работает тоже, метод есть там addAll

который принимает коллекцию

и вот он ругается, n&r^ звездочка непоределенная коллекция

Andrey
09.10.2018
14:02:18
который принимает коллекцию
Тогда вы хотите странного. У вас тип поля не может гарантировать, что вы в HouseCardAdapter не начнёте пихать Land

Поэтому система типов вам такое и не даёт

Костя
09.10.2018
14:03:06
а если переопределить у каждого addAll

метод

может помочь как-то ?

Костя
09.10.2018
14:04:09
я вроде понимаю в чем дело, просто андройдовский ArrayAdapter просто <T> то есть он держит массив каких-то элементов, может чистить его, добавлять, принимать

странно что не получается сделать какой-то адаптер которому неважно чем его инитить лишь бы наследниками ArrayAdapter

точнее это сделать можно через *

но вот как сделать добавление чтобы работало

Страница 936 из 982