Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function Kotlin中的Kleisli指数化_Function_Kotlin - Fatal编程技术网

Function 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

我试着用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

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中已经有和,都使用
。但目前不支持局部变量和参数引用。