Size: a a a

Programming Offtop

2020 October 05

I

Ilmir in Programming Offtop
Очевидно же, что создается функтор (в данном случае лямбда), который принимает тип и этот функтор сразу же вызывается с передачей объекта, созданного конструктором по умолчанию. Если его нет, то, компилятор скажет "нема такого конструктора" и ругнётся, что не удовлетворяет концепту.
источник

I

Ilmir in Programming Offtop
Viktor Noskin
Слово "симпатичного" тут явно лишнее
Это уже такой пример хака, когда он из уродливого становится прекрасным.
источник

I

Ilmir in Programming Offtop
Как и весь SFINAE, в общем-то.
источник

(

( in Programming Offtop
посмотрите на это дерьмо
The protocol supports up to 65597 streams with IDs 3-65599. The IDs
0, 1, and 2 are reserved. Value 0 indicates the 2 byte form and an
ID in the range of 64-319 (the second byte + 64). Value 1 indicates
the 3 byte form and an ID in the range of 64-65599 ((the third
byte)*256 + the second byte + 64). Values in the range of 3-63
represent the complete stream ID. Chunk Stream ID with value 2 is
reserved for low-level protocol control messages and commands.
источник

(

( in Programming Offtop
просто крайняя степень байтоебства
источник

I

Ilmir in Programming Offtop
Alexander Nozik
Ну как бы тут адекватное восприятие. Но я регулярно встречаю чуваков, которые всерьез считают, что там все классно.
Ну как бы спорить про синтаксис - это не видеть за деревьями леса. Бессмысленно о нём спорить, пока не узнаёшь про задачи, которые человеку надо решить, а как только узнаешь, внезапно оказывается, что способ решения громозкий, и теперь уже поздно спорить о громозкости синтаксиса, потому что другого способа решения и нет. Вон, @happy_bracket не жалуется же на синтаксис тайпклассов в скале.
источник

(

( in Programming Offtop
Ilmir
Ну как бы спорить про синтаксис - это не видеть за деревьями леса. Бессмысленно о нём спорить, пока не узнаёшь про задачи, которые человеку надо решить, а как только узнаешь, внезапно оказывается, что способ решения громозкий, и теперь уже поздно спорить о громозкости синтаксиса, потому что другого способа решения и нет. Вон, @happy_bracket не жалуется же на синтаксис тайпклассов в скале.
у тайпклассов в скале нормальный синтаксис
источник

I

Ilmir in Programming Offtop
(
у тайпклассов в скале нормальный синтаксис
Ну....
implicit class ShowOps[A](val a: A) extends AnyVal {
 def show(implicit sh: Show[A]) = sh.show(a)
}
object Show {
 def apply[A](implicit sh: Show[A]): Show[A] = sh

 def show[A: Show](a: A) = Show[A].show(a)

 implicit class ShowOps[A: Show](a: A) {
   def show = Show[A].show(a)
 }

 implicit val intCanShow: Show[Int] =
   new Show[Int] {
     def show(int: Int): String = s"int $int"
   }
}
источник

(

( in Programming Offtop
Ilmir
Ну....
implicit class ShowOps[A](val a: A) extends AnyVal {
 def show(implicit sh: Show[A]) = sh.show(a)
}
object Show {
 def apply[A](implicit sh: Show[A]): Show[A] = sh

 def show[A: Show](a: A) = Show[A].show(a)

 implicit class ShowOps[A: Show](a: A) {
   def show = Show[A].show(a)
 }

 implicit val intCanShow: Show[Int] =
   new Show[Int] {
     def show(int: Int): String = s"int $int"
   }
}
а тайпкласса-то тут и нет
источник

(

( in Programming Offtop
Show это тайпкласс, все остальное - утилитки
источник

I

Ilmir in Programming Offtop
Ну да, знал же, что что-то забыл. Вон сам тайпкласс
trait Show[A] {
 def show(a: A): String
}
источник

I

Ilmir in Programming Offtop
А его реализация - громозкая. В минимуме будет что-то типа
object Show {
 def show[A](a: A)(implicit sh: Show[A]) = sh.show(a)

 implicit val intCanShow: Show[Int] =
   new Show[Int] {
     def show(int: Int): String = s"int $int"
   }
}
источник

(

( in Programming Offtop
не, реализация тайпкласса - это
implicit val intCanShow: Show[Int] =
   new Show[Int] {
     def show(int: Int): String = s"int $int"
   }

ShowOps это имплисит конвершен (ака экстеншен-функция), чтобы через точку вызывать show у всего, для чего есть реализация тайпкласса
обжект с идентичным именем и апплаем нужен, чтобы время от времени доставать из имплиситного контекста явную реализацию
источник

(

( in Programming Offtop
зачем нужен вложенный ShowOps я хз
источник

I

Ilmir in Programming Offtop
(
не, реализация тайпкласса - это
implicit val intCanShow: Show[Int] =
   new Show[Int] {
     def show(int: Int): String = s"int $int"
   }

ShowOps это имплисит конвершен (ака экстеншен-функция), чтобы через точку вызывать show у всего, для чего есть реализация тайпкласса
обжект с идентичным именем и апплаем нужен, чтобы время от времени доставать из имплиситного контекста явную реализацию
Без этого имплисит конвершена (можно без ShowOps, только с функцией show из моего примера, если мои скромные знания скалы не подводят) у тебя не будет возможности вызывать через точку, то есть смысл в тайпклассах теряется. Короче, одного объявления анонимного объекта не достаточно, нужна ещё функция. А потом уже да, достаточно всего лишь анонимного объекта.
источник

(

( in Programming Offtop
Ilmir
Без этого имплисит конвершена (можно без ShowOps, только с функцией show из моего примера, если мои скромные знания скалы не подводят) у тебя не будет возможности вызывать через точку, то есть смысл в тайпклассах теряется. Короче, одного объявления анонимного объекта не достаточно, нужна ещё функция. А потом уже да, достаточно всего лишь анонимного объекта.
чего это он теряется? Ты все ещё можешь делать например вот так
def mapToStrings[F[_] : Functor, A : Show](as: F[A]): F[String] = ...
источник

(

( in Programming Offtop
через точку вызывать, разумеется, удобнее, но не первоочередная задача
источник

I

Ilmir in Programming Offtop
(
чего это он теряется? Ты все ещё можешь делать например вот так
def mapToStrings[F[_] : Functor, A : Show](as: F[A]): F[String] = ...
Тогда и в Котлине есть тайпклассы:
interface Show<T> {
   fun show(a: T): String
}

val intCanShow = object : Show<Int> {
   override fun show(a: Int) = "int $a"
}

fun main() {
   println(intCanShow.show(1))
}
источник

(

( in Programming Offtop
Ilmir
Тогда и в Котлине есть тайпклассы:
interface Show<T> {
   fun show(a: T): String
}

val intCanShow = object : Show<Int> {
   override fun show(a: Int) = "int $a"
}

fun main() {
   println(intCanShow.show(1))
}
intCanShow при вызове тебе придется передавать явно
источник

(

( in Programming Offtop
точнее, у тебя пример не тот
источник