Хаскельные имплиситы резолвятся по имени, скаловые резолвятся по типу.
Скаловые имплиситы родились примерно с той же целью, что хаскельные, но затем проделали большой путь по превращению в костыльные тайпклассы. Поэтому большая часть сравнения будет, скорее затрагивать их.
Т.е. для симуляции тайпкласса придумывается параметрический тип, применения которого служат затем заголовками инстансов.
Никаких ограничений на алиасы нет, чтобы поставить приоритет у скаловых инстансов никакого специального синтаксиса нет. Используются родные любому ооп-разработчику механизмы "подтипирования" и "наследования" - да, это два разных способа сделать один инстанс более приоритетным, чем другой, вступающие в конфликт.
Скаловые имплиситы будут резолвиться не только в непосредственном лексическом скоупе места вызова, компилятор дополнительно посмотрит в компаньонах всех упомянутых типов, опять же симулируя, поиск инстансов из модулей, в которых определён тайпкласс и сам тип.
Как и в хаскеле инстансы могут быть полиморфными и требовать других инстансов. Как и в хаскеле с достаточным набором расширений и в расте, на этом можно строить какие-то фриканутые исчисления.
Скаловые имплиситы очень существенно некогерентны, и участвуют в выводе типов. Т.е. скаловый компилятор может найти инстанс, заматчив его параметры с известными типами и получить оттуда часть неизвестных. Примерно, как если бы у вас были фундепы, которые работали во все стороны (непредсказуемо). Имплиситы могуть быть реализованы с помощью макросов. Мало того, эти макросы могут производить не только термы, но и типы. Например генерация Generic (примерный аналог того, что х-ле) сделан как такой макро-имплисит.
Предсказать ход вывода типов перемежающийся с такой деривацией очень сложно, это зависит от текущей реализации компилятора и меняется из версии в версию
Однако упоминали, что артефакты тех времён, когда имплиситы несли функцию просто неявных параметров во 2-й скале остались.
В частности, единственный способ принести сиротские инстансы, а они часто нужны - импортировать или примешать реальные имена в лексический скоуп, это значит, что любая переменная с тем же именем зашэдоуит ваш инстанс, и действительно, порядок импортов или наличие локально объявленных имён обычных переменных может помешать компилятору увидеть инстанс.
В третьей скале это пофиксили.
Однако имплиситы остаются просто значениями обычных типов, поэтому можно делать разные трюки.
Например для любителей тэглесс файнал можно положить инстанциированные инстансы прямо контекст ридер-манатки и дальше вывести что-то вроде
HasLens ctx (Foo f), MonadReader f ctx => Foo f