import cats._
import cats.implicits._
import scala.concurrent._
import scala.concurrent.duration.Duration._
import scala.concurrent.ExecutionContext.Implicits.global
trait Lam[F[_]] {
def lit[A](a: A): F[A]
def op[A, B](f: A => B): F[A => B]
def app[A, B](f: F[A => B])(a: F[A]): F[B]
}
object Lam {
def apply[F[_] : Lam] = implicitly[Lam[F]]
def lit[F[_] : Lam, A](a: A): F[A] = Lam[F].lit(a)
def op[F[_] : Lam, A, B](f: A => B): F[A => B] =
Lam[F].op(f)
def app[F[_] : Lam, A, B](f: F[A => B])
(a: F[A]): F[B] =
Lam[F].app(f)(a)
def lam[F[_] : Lam, A, B](f: F[A] => F[B]) = f
}
implicit def applam[F[_] : Applicative]: Lam[F] =
new Lam[F] {
def lit[A](a: A): F[A] =
Applicative[F].pure(a)
def op[A, B](f: A => B): F[(A) => B] =
Applicative[F].pure(f)
def app[A, B](f: F[A => B])(a: F[A]): F[B] =
Applicative[F].ap(f)(a)
}
val PLUS = ((_: Int) + (_: Int)).curried
import Lam._
def answer[F[_] : Lam] = lam((x: F[Int]) =>
app(app(op(PLUS))(x))(x))
def main[F[_] : Lam : Functor] =
answer[F].andThen(_.map(println))
main[Id].apply(21)
Await.ready(main[Future].apply(Future(21)), Inf)
no subject
Date: 2016-11-27 11:55 am (UTC)И SKI можно?
no subject
Date: 2016-11-27 01:59 pm (UTC)вобще вопрос понятный конечно - и попробовать для интереса конечно можно (я даже пробовал в предыдущей версии - но застопорился на S ) для проверки замкнутости и полноценности - но в практическом смысле мне кажется достаточно уже того что аппликативный функтор в категории Клейсли уже сам по себе представляет собой полный базис SKI
вобще тут еще много чего остается для дальнейшего исследования - я пока так быстро еще не успеваю все сразу проверить :) выкладываю результаты по мере их появления ... )
попробую насчет SKI дальше конечно еще тоже - но сам по себе SKI не слишком удобен для непосредственного использования - зато конечно удобен для конечного какбы результата компиляции (если SKI непосредственно в виде аппликативного функтора) - вобщем нужно еще дальше смотреть пробовать проверять и тд
no subject
Date: 2016-11-27 02:05 pm (UTC)но я несколько сомневаюсь что Y можно построить в таком виде (в какой либо категории функторов) - Y это скорее всего "примитив" такого же рода как например операция сложения двух чисел (если не выражать числа в какой либо лямбда-кодировке)
но теоретически конечно нужно тоже проверить :) вдруг чтото и получится ...
no subject
Date: 2016-11-28 11:55 am (UTC)no subject
Date: 2016-11-28 12:50 pm (UTC)вопрос в выразимости Y в категории функторов - SKI и лямбды в функторах выражается без особых проблем как оказалось (SKI в Клейсли, лямбды непосредственно в виде функторов)
а вот с Y пока не ясно что делать в этом случае - ну кроме как просто лифтить в категорию полностью весь Y (да и то нужно еще понять как это лучше делать)
no subject
Date: 2016-11-28 04:40 pm (UTC)Такое в Rust тоже можно написать.
no subject
Date: 2016-11-28 05:28 pm (UTC)самый простой случай (как у меня выше вот)
Y:((a -> a) -> ( a -> a)) -> a -> a
но есть разумеется и с рекурсивными типами варианты
самое плохое другое - рекурсия не хвостовая - но по нормальному сделать хвостовую рекурсию достаточно сложно (если ее изначально нет в метаязыке) - только через некий вариант свободной монады (трамплин) в императивном цикле (это должно быть частью стандартного рантайма)
no subject
Date: 2016-11-28 09:47 pm (UTC)тут еще интересно: app ~ (.), потому что F[A=>B] `app` F[A] == F[A=>B] . F[()=>A] == F[()=>B]
no subject
Date: 2016-11-29 11:46 am (UTC)подозреваю что именно через <*> :)
no subject
Date: 2016-11-29 11:48 am (UTC)А для эндофунктора это одна и та же (.)
no subject
Date: 2016-12-02 11:05 pm (UTC)F[A=>B] `ap` F[C=>A] == ?
no subject
Date: 2016-12-03 08:54 am (UTC)no subject
Date: 2016-12-03 11:30 am (UTC)no subject
Date: 2016-12-03 01:46 pm (UTC)Тут скорее вопрос к нотации. В теоркате F f - это отображение f в категорию. Однако, что такое F f в скале? Это fmap f? Или F[A=>B]? В первом случае f интерпретируется как стрелка (со встроенной в язык композицией), а во втором - как экспонента.
no subject
Date: 2016-12-03 02:39 pm (UTC)no subject
Date: 2016-12-03 02:47 pm (UTC)no subject
Date: 2016-12-03 02:51 pm (UTC)no subject
Date: 2016-12-03 02:57 pm (UTC)(экспонента - это такой объект BA, что для всех морфизмов f: A→B существует curry f: BA такой, что коммутирует диаграмма eval . <1 × curry f> = f)
no subject
Date: 2016-12-03 09:25 pm (UTC)no subject
Date: 2016-12-04 08:31 am (UTC)