robstoll
05/02/2018, 6:07 PMfun <T> foo(t: T){
val i: (T) -> T = { it }
}
marcinmoskala
05/02/2018, 7:13 PMinline fun <reified T> makeId() = { x: T -> x }
But it is not what I am looking for π
I wanted something like Haskell
id :: a -> a
id x = x
robstoll
05/02/2018, 7:21 PMmarcinmoskala
05/02/2018, 7:22 PMinline fun <reified T> id() = { x: T -> x }
val double = { i: Int -> i * 2 }
infix fun <A, I, R> ((I)->R).after(f: (A)->I) = { a: A -> this(f(a)) }
fun main(args: Array<String>) {
val f = double after id() after id() after double after double after id()
print(f(1)) // 8
}
marcinmoskala
05/02/2018, 7:22 PMmarcinmoskala
05/02/2018, 7:22 PMmarcinmoskala
05/02/2018, 7:23 PMval f = double after id after id after double after double after id
robstoll
05/02/2018, 7:23 PMmarcinmoskala
05/02/2018, 7:23 PMinline fun <reified T> id() = { x: T -> x }
val double = { i: Int -> i * 2 }
operator fun <A, I, R> ((I)->R).times(f: (A)->I) = { a: A -> this(f(a)) }
fun main(args: Array<String>) {
val f = double * id() * id() * double * double * id()
print(f(1)) // 8
}
robstoll
05/02/2018, 7:27 PMmarcinmoskala
05/02/2018, 7:35 PMval double = { i: Int -> i * 2 }
operator fun <A, I, R> ((I)->R).times(f: (A)->I) = { a: A -> this(f(a)) }
fun <T> id(x: T) = x
fun main(args: Array<String>) {
val f = double * ::id * ::id * double * double * ::id
print(f(1)) // 8
}
marcinmoskala
05/02/2018, 7:36 PMval double = { i: Int -> i * 2 }
operator fun <A, I, R> ((I)->R).times(f: (A)->I) = { a: A -> this(f(a)) }
val id = fun <T> (x: T) = x
fun main(args: Array<String>) {
val f = double * id * id * double * double * id
print(f(1)) // 8
}
marcinmoskala
05/02/2018, 7:37 PMrobstoll
05/02/2018, 8:08 PMrobstoll
05/02/2018, 8:27 PMrobstoll
05/02/2018, 8:27 PMfun <T> id(x: T) = x
fun <T, R, S> and(f: (T) -> R, g: (R) -> S): (T)-> S = {t -> g(f(t)) }
fun main(args: Array<String>) {
val f = and(and(and(double, ::id), ::id), double)
println(f(1))
}
robstoll
05/02/2018, 8:32 PMval double = { i: Int -> i * 2 }
fun <T> id(x: T) = x
infix fun <T, R, S> ((T) -> R).and(g: (R) -> S): (T)-> S = {t -> g(this(t)) }
fun main(args: Array<String>) {
val f = double and double and ::id and ::id and double
println(f(1))
}
robstoll
05/02/2018, 8:34 PMrobstoll
05/02/2018, 8:34 PMmarcinmoskala
05/02/2018, 8:37 PMval double = { i: Int -> i * 2 }
fun <A, I, R> ((I)->R).after(f: (A)->I) = { a: A -> this(f(a)) }
fun <T> id(x: T) = x
fun main(args: Array<String>) {
val intId: (Int)->Int = ::id
val f = double.after(intId)
print(f(1)) // 2
}
robstoll
05/02/2018, 8:37 PM::id
which fails but the times
operatormarcinmoskala
05/02/2018, 8:38 PMval double = { i: Int -> i * 2 }
fun <A, I, R> ((I)->R).after(f: (A)->I) = { a: A -> this(f(a)) }
fun <T> id(x: T) = x
fun main(args: Array<String>) {
val f = double.after<Int, Int, Int>(::id)
print(f(1)) // 2
}
robstoll
05/02/2018, 8:39 PMmarcinmoskala
05/02/2018, 8:39 PMval double = { i: Int -> i * 2 }
infix fun <A, I, R> ((A) -> I).then(f: (I) -> R) = { a: A -> f(this(a)) }
fun <T> id(x: T) = x
fun main(args: Array<String>) {
val f = double then ::id
print(f(1)) // 2
}
robstoll
05/02/2018, 8:39 PMrobstoll
05/02/2018, 8:40 PMmarcinmoskala
05/02/2018, 8:41 PMrobstoll
05/02/2018, 8:42 PMmarcinmoskala
05/02/2018, 8:47 PMmarcinmoskala
05/02/2018, 8:49 PMrobstoll
05/02/2018, 9:18 PMmarcinmoskala
05/03/2018, 6:49 PM