Ayrat
пример функция, создай массив по длине. Подаём 0 - получаем на выходе ТИП ArrayWithZeroLength Подаём 1 - ArrayWithLength1 ...
Ayrat
обычно в языках с депендент типами там умнее это записывается
Ayrat
но для примера пойдёт
Фил Ранжин
а 1-ый аргумент - константа ?
Ayrat
а 1-ый аргумент - константа ?
ну просто аргумент
Ayrat
let createArray (n: int) = ...
Ayrat
всё что о нём знаешь, что это число
Vasily
Мне тут кстати предлагают на скале пописать.
Another one bites the dust. EitherT, for, вот это вот все
Фил Ранжин
погодите, если ты не знаешь значения 1-шго аргша во времся компиляции, как ты тогда выведешь тип второго арга?
Ayrat
но вообще с депендент типами ты знаешь что это не просто число
Ayrat
а КАКОЕ это число
Ayrat
потому что число будет зашито в тип
Ayrat
короче, начать надо с описания чисел в типах. тогда твоя программа сможет выводить длину массива в статике
Фил Ранжин
ну, такие вещи даже на сисярпе можно по идее сделать, немного костыльно. Делаешь тип int0-10, поставляешь фабричную фн, которая возвращает опшн(твой аналог), и опшн сам будет иметь тип числа от 0 до 10
Фил Ранжин
Я ведь чего-то не понимаю, да?
Фил Ранжин
гоните литературу. Лучше на русском
Romɑn
не шарю за термины. Прояснишь?
Еще кейс эти ваши ТензорФлоу когда у тебя только в рантайме выпадает ощибка что ты перемножаешь Матрицу размерностью (2х3) с матрицей размерностью (4х1) Тоже линейные типы были бы очень кстати
Doge
гоните литературу. Лучше на русском
Вот с этим сложно. Читать тут придется много и вряд ли на русском. Из вариантов: The Little Typer, Type driven development with Idris, http://docs.idris-lang.org/en/latest/tutorial, https://softwarefoundations.cis.upenn.edu/current/index.html, https://plfa.github.io
Ayrat
тупой пример type Number = | Zero | One | Two ... let createArray (n: Number) = match n with | Zero -> Array<Length=1> | One -> Array<Length=2> ... В нормальных языках это генерализируется и писать ничего не надо. А бесконечные DU чисел сворачиваются в что-то типа чисел Пеано
Фил Ранжин
бля
Фил Ранжин
качество гифки хуйня, но сёравно видно
Фил Ранжин
вот
Фил Ранжин
@omgszer , ты про это говорил?
Ayrat
@omgszer , ты про это говорил?
да, похоже на правду
Ayrat
ток теперь надо для любого числа!
Фил Ранжин
крэп
Фил Ранжин
ну слушай, сегодня до тысячи сделаю))
Фил Ранжин
хехе
Фил Ранжин
Фил Ранжин
идрис7
Ayrat
ну да, все пруверы имеют депендент типы
Ayrat
в ликвид хаскеле ещё есть
Doge
а где так есть?
Кроме перечисленной экзотики, из мейнстрима в скале так можно сделать. Там некоторый вариант зависимых типов есть.
Romɑn
Фил Ранжин
F* ?
Romɑn
F* ?
ага
Doge
оу, а можно пример?
Вот здесь обсуждения про скалу и зав типы: https://stackoverflow.com/questions/12935731/any-reason-why-scala-does-not-explicitly-support-dependent-types Как пример использования в быту см. shapeless. Там куча всего, среди этого есть коллекции параметризованные их длиной: https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#collections-with-statically-known-sizes
Vasily
@trigun27 Там подвезли трейлер surge 2
Doge
многатекста! мнеработатьнадо! естьвыжимка?
Выжимка - это как раз stackoverflow, там вкратце описывается как и насколько выразимы зав типы в скале.
Vasiliy
@trigun27 Там подвезли трейлер surge 2
Ахахах, только собирался тебе кинуть его
Vasiliy
что то все игроделы ударились в фиолетовый с оранжевым(
Vasily
Тем не менее вопрос, во что играть летом, остер как никогда
Vasiliy
Отдыхать. Ты видел, там осенью надо будет обмазываться играми. Потом в апреле и марте
Vasily
Ну в апреле там вообще много вкусного
Romɑn
Сразу напомни плз, в скале DU нет и там как раз открытые множества вместо DU ипользуются? Как в TS. типа int | string подмножество int | string | bool
Vasily
Бладборн, шоле, пройти все же
Vasiliy
Ну в апреле там вообще много вкусного
да там вообще жесть. СайберПанк. вотч догз, что то еще. В сентябре и ноябре тоже всякого хватает. жесть
Doge
Сразу напомни плз, в скале DU нет и там как раз открытые множества вместо DU ипользуются? Как в TS. типа int | string подмножество int | string | bool
Нет, там чуть другой энкодинг. АДТ вида data MyList a = Nil | Cons a (MyList a) в скале делается примерно так (можно без object'а обойтись, например): sealed trait MyList[A] object MyList { case object Nil extends MyList[Nothing] final case class Cons[A](head: A, tail: MyList[A]) extends MyList[A] } Такой энкодинг многословный (будет улучшен в дотти), но у него есть один плюс - через него можно GADT выразить элементарно.
Alexey
всё, уехала?
Анна
Анна
просто пока я тупила, выбора почти и не осталось 🤷‍♀️
Romɑn
Да про кейс классы понятно интерtсует другой момент. есть метод\ф-ция которые принимают этот MyList[A] типа def show ( l:MyList[A]) = { ... } и кто-то другой пишет где-то: case class WTF[A] extends MyList[A] теперь моя волшебная ф-ция show сломается? или кейворд final запрещает расширять MyList? а если final не будет? Я скалануб так что мб не вижу очевидных вещей
Vasily
просто пока я тупила, выбора почти и не осталось 🤷‍♀️
Ну бывает, чо. Всегда есть вариант тюленить дома
Romɑn
просто пока я тупила, выбора почти и не осталось 🤷‍♀️
Тут недалеко от КРД на кайтинге можно покататься
Анна
В Будву поеду
Анна
Romɑn
Анна
Черногория
Romɑn
Тут трюк в sealed обьявлении трейта и final у его наследников case class'ов: The sealed modifier applies to class definitions. A sealed class may not be directly inherited, except if the inheriting template is defined in the same source file as the inherited class. However, subclasses of a sealed class can be inherited anywhere.
так, т.е. с помощью этого волшебства мы сделали DU и я правильно понимаю, что мы можем оставить возможность наделать case классов сколько угодно?
Romɑn
типа case class Mylol extends object
Romɑn
как наследование обычное в java/C#
Romɑn
F# в том числе)
Doge
типа case class Mylol extends object
(Запись некорретная, т.к. object ключевое слово языка)
Romɑn
нутыпонял
Doge
Но в целом да, case class может наследоваться от других классов, если они не final