Почему! оператор совпадает с .bind() в понимании монады со стрелкой?

#kotlin #arrow-kt

#kotlin #стрелка-kt

Вопрос:

Один из способов bind() понимания монады со стрелкой — это «кричать» (третий пример):

 /**
 * All possible approaches to running [Kind] in the context of [Fx]
 *
 * ```
 * fx {
 *   val one = just(1).bind() // using bind
 *   val (two) = just(one   1) // using destructuring
 *   val three = !just(two   1) // yelling at it
 * }
 * ```
 */
  

Поскольку ! оператор Kotlin используется для отрицания логического значения, можете ли вы объяснить, как и почему это работает таким образом в Arrow?

Ответ №1:

Я нашел ответ в документе Kotlin о перегрузке оператора: https://kotlinlang.org/docs/reference/operator-overloading.html

BindSyntax переопределяет оператор not:

 interface BindSyntax<F> {

  suspend fun <A> Kind<F, A>.bind(): A

  suspend operator fun <A> Kind<F, A>.not(): A =
    bind()
}