Size: a a a

Scala User Group

2021 August 31

S

Simon in Scala User Group
жесть какая...
f - параметр метода, то есть он в контравариантной позиции
A => B - Параметр функции (A) тоже в контравариантной позиции
Таким образом f: A => B - тут A в дважды контравариантной позиции, то есть в ковариантной позиции
источник

S

Simon in Scala User Group
A - параметр функции в параметре метода. Тот случай, когда минус на минус дает плюс
источник

χλ

χоρоший ☽☽☽ λисuчко... in Scala User Group
Извиняюсь, а почему жесть? х)
источник

S

Simon in Scala User Group
думать приходится. не люблю я это дело
источник

IK

Ivan Kerenskiy in Scala User Group
Тогда почему это не работает?
case class Sample[+A]() {
 
 def method[B](f: A =>
B) = ???
 
}

val f: Nothing => Int = ???

Sample[Int]().method[Int](f)

https://scastie.scala-lang.org/SwQrzrtiSeitPay9C2uAyw
источник

χλ

χоρоший ☽☽☽ λисuчко... in Scala User Group
Ой, а ??? – это способ не писать тело функции, дабы проверить type checking?
источник

IK

Ivan Kerenskiy in Scala User Group
Ну типа того, хотя я не эксперт
источник

S

Simon in Scala User Group
Тут с точностью до наоборот.
В коде выше Int => Int используется там, где ожидается Nothing => Int - так можно из-за контравариантности. В вашем коде Nothing => Int используется там, где ожидается Int => Int - так нельзя
источник

IK

Ivan Kerenskiy in Scala User Group
А, блин
источник

S

Simon in Scala User Group
??? - метод, возвращающий Nothing.
источник

Oℕ

Oleg ℕizhnik in Scala User Group
f: Int => Int
- это функция, которая принимает целое число, и возвращает целое
представим, что у нас есть
PosInt <: Int, некое положительное подмножество целых, наша функция определена для любых целых чисел, значит для всех положительных как минимум, что скала позволяет записать как
f: PosInt => Int
таким образом для любого подмножества целых чисед f определена на нём, что соответствует некому суждению в нашей системе типов
Nothing соответствует пустому подмножеству значений для множества значений любого типа
и любая функция
g: A => B определена на нём, что выражается как суждение
g: Nothing => B

таким образом, какую бы функцию f : A => B вы не передали, она так же является функцией Nothing => B, т.е. функцией с которой снимается необходимость обрабатывать что-либо, и нет никакого противоречия, в том чтобы передать её в метод, принимающий такой аргумент
источник

χλ

χоρоший ☽☽☽ λисuчко... in Scala User Group
Пошло что-то по Карри-Говарду
источник

Oℕ

Oleg ℕizhnik in Scala User Group
не
источник

Oℕ

Oleg ℕizhnik in Scala User Group
это попытка связать типы и множества, и подтипы и подмножества, довольно своевольная и неформальная чисто для интуиции
источник

Oℕ

Oleg ℕizhnik in Scala User Group
это очень ограниченная ассоциация, она не всегда работает, просто, чтобы решить проблему "как так"
источник
2021 September 01

GP

Grigory Pomadchin in Scala User Group
мне проще так: Int => Int частный случай функции (подтип) Nothing => Int
т.к. Nothing это подтип Int то Int более общий тип
функция из более общего типа (Int) в менее общий (Int в этом случае, у нас они совпадают) будет подтипом функции
источник

S

Simon in Scala User Group
не верно
источник

GP

Grigory Pomadchin in Scala User Group
почему не верно? верно
любая функция из более общего типа в менее общий тип это подтип
источник

S

Simon in Scala User Group
туплю
источник

S

Simon in Scala User Group
все верно
источник