Size: a a a

2020 July 16

KR

Kai Ren in rust_offtopic
Doge Shibu
Основания разница в том, что нет когерентности и в механизме их ресолва.

В хаскеле и расте инстансы ищутся по всей программе, в скале по лексическим областям и импортам в данном файле
Это получается один и тот же тип, при использовании в разных модулях может иметь разные имплементации?
источник

DS

Doge Shibu in rust_offtopic
Kai Ren
Это получается один и тот же тип, при использовании в разных модулях может иметь разные имплементации?
Да
источник

KR

Kai Ren in rust_offtopic
Таки сумрачная гениальность
источник

H

Hirrolot in rust_offtopic
Вафель
Всм? А тот хак с auto Trait + impl !Trait не работает?
_нормально_

ещё в demux-stream безумные сообщения об ошибках, потому что индуктивный frunk::Coprod наслаивается на комбинаторы стримов и замыкания!
источник

В

Вафель in rust_offtopic
Hirrolot
_нормально_

ещё в demux-stream безумные сообщения об ошибках, потому что индуктивный frunk::Coprod наслаивается на комбинаторы стримов и замыкания!
в чём ненормальность?
источник

H

Hirrolot in rust_offtopic
Вафель
в чём ненормальность?
хак — по определению ненормально
источник

В

Вафель in rust_offtopic
Hirrolot
хак — по определению ненормально
эй
источник

В

Вафель in rust_offtopic
это вполне нормальная замена специализации, которая не работает
источник

H

Hirrolot in rust_offtopic
но это ненормально!
источник

В

Вафель in rust_offtopic
И, имхо, в данном случае это даже лучше специализации т.к. не даёт пользователям шалить
источник

В

Вафель in rust_offtopic
Hirrolot
но это ненормально!
нормально!
источник

H

Hirrolot in rust_offtopic
источник

В

Вафель in rust_offtopic
Ну а какое решение ты бы считал нормальным?
источник

KR

Kai Ren in rust_offtopic
хкт же
источник

NL

Nick Linker in rust_offtopic
Kai Ren
Об имплиситах же
В скале если, то это неявный параметр, который компилятор ищет в текущем implicit scope. Пример:
    @tailrec
   def find[A, B](key: A, xs: List[A])(implicit e: Eq[A]): Maybe[A] = xs match {
       case Nil => Nothing
       case x :: xs => if (e.eq(key, x)) Just(x) else find(key, xs)
   }
это функция, которая принимает 2 явных параметра и один неявный e.
Задача решается следующая: дано значение типа A и список значений того же типа A, найти его первое вхождение, если оно там есть.
Алгоритм простой: идём сначала до конца и проверяем, равен ли элемент или нет. Естественно возникает вопрос: а кто сказал, что значения можно сравнивать?
На этот вопрос даёт ответ имплисит e (его часто ещё называют witness), который и обеспечивает нужную функциональность.
Короче, всё как в Rust, только в Rust мы обычно пишем find<A: Eq>.

Когда эта функция вызывается, например:
val xs = List(1, 2, 3)
val y = find(4, xs)
то компилятор ищет в текущем неявном скоупе какой-нибудь объект типа Eq[Int] и если он его находит в единственном экземпляре, то подставляет туда и формирует вызов. Ошибкой является как то, что объекта такого типа не находится, так и то, что таких объектов больше одного.
Принести значение нужного типа в неявный скоуп можно импортом, объявлением в текущем классе, в объекте-компаньоне и как-то ещё, не суть важно (тем более правила поиска имплиситов менялись от версии к версии, сейчас я не в курсе каков порядок поиска).
источник

H

Hirrolot in rust_offtopic
Вафель
Ну а какое решение ты бы считал нормальным?
специализацию конечно
источник

H

Hirrolot in rust_offtopic
Kai Ren
хкт же
и это тоже там требуется
источник

В

Вафель in rust_offtopic
Kai Ren
хкт же
Универсальный ответ конечно, но вроде unrelated к проблеме
источник

В

Вафель in rust_offtopic
Hirrolot
специализацию конечно
Чем специализация лучше/нормальнее?
источник

H

Hirrolot in rust_offtopic
Вафель
Чем специализация лучше/нормальнее?
тем что мне не нужно чесать мизинцем фурункул в ухе
источник