Function Kotlin中的Kleisli指数化
我试着用Kotlin写Kleisli指数:Function Kotlin中的Kleisli指数化,function,kotlin,Function,Kotlin,我试着用Kotlin写Kleisli指数: fun <A,B> kleisli(n: Int, f: (A) -> B): (A) -> B = if (n == 1) f else { it -> f(kleisli(n-1, ::f)(it)) } funkleisli(n:Int,f:(A)->B):(A)->B=if(n==1)f else{it->f(kleisli(n-1,::f)(it))} 这只包括f,n次(请不要在我的代码中放入n=0) Kot
fun <A,B> kleisli(n: Int, f: (A) -> B): (A) -> B = if (n == 1) f else { it -> f(kleisli(n-1, ::f)(it)) }
funkleisli(n:Int,f:(A)->B):(A)->B=if(n==1)f else{it->f(kleisli(n-1,::f)(it))}
这只包括f
,n
次(请不要在我的代码中放入n=0
)
Kotlin(1.0.6)抱怨错误:不支持[对变量的引用尚不支持]
指向::f
我做错了什么吗?只使用
f
而不是::f
,它已经是一个函数值(即参数、变量或函数类型的属性),因此不需要对它进行可调用的引用
... else { it -> f(kleisli(n - 1, f)(it)) }
此外,您的示例似乎存在类型不匹配:kleisli(n-1,f)
返回类型为(a)->B
的函数,该函数在类型为a
的上调用,返回类型为B
的结果。然后将结果传递给f
,但是f
只能接收A
。要解决此问题,可以删除类型参数B
,只保留A
:
fun <A> kleisli(n: Int, f: (A) -> A) : (A) -> A =
if (n == 1)
f else
{ it -> f(kleisli(n - 1, f)(it)) }
有趣
此外,这段代码在函数式中很好地展示了这一意图,但它可能会导致冗余对象分配和不希望的调用堆栈增长。但是,可以将其改写为命令式风格,这将更有效地工作:
fun <T> iterativeKleisli(n: Int, f: (T) -> T) : (T) -> T = { x ->
var result = x
for (i in 1..n)
result = f(result)
result
}
有趣的迭代kleisli(n:Int,f:(T)->T):(T)->T={x->
var结果=x
for(1..n中的i)
结果=f(结果)
结果
}
谢谢!这很有效。看来我需要更多地了解科特林。还有,很抱歉,没有提到组成f,f必须是a->a。出于好奇,这个错误意味着什么(对变量的引用还不受支持)?@Koyomi chan,如果支持的话,::f
表示对函数的参数f
的可调用引用——一个包含有关该参数的一些信息并提供获取其值的方法的对象。Kotlin中已经有和,都使用:
。但目前不支持局部变量和参数引用。