带递归的Scala泛型
所以我有一个通用的组合词 回想一下,两个函数f和g的组合是h(x)=f(g(x)) 但是现在我想使用我的compose函数递归地实现自合成迭代器组合器,其中:带递归的Scala泛型,scala,generics,Scala,Generics,所以我有一个通用的组合词 回想一下,两个函数f和g的组合是h(x)=f(g(x)) 但是现在我想使用我的compose函数递归地实现自合成迭代器组合器,其中: def selfIter[T](f: T=>T, n: Int) = f composed with itself n times. 我试着这样做: def selfIter[T](f: T, n: Int): T = { if(n == 0) f else f + selfIter(f,
def selfIter[T](f: T=>T, n: Int) = f composed with itself n times.
我试着这样做:
def selfIter[T](f: T, n: Int): T = {
if(n == 0) f
else f + selfIter(f, n-1)
}
//TEST
println(selfIter(compose(double, inc, 2.0), 2))
我犯了一个错误,我知道我在做一些根本错误的事情,但我不知道我需要做什么
在这种情况下,输出应该是14.0,因为第一次调用将是2(2+1)=6.0,然后第二次调用将是2(6.0+1)=14.0
问题:我应该如何重构我的代码,以便selfIter将自身合成f n次,直到n==0,并返回最终值解决此类问题的最简单方法是使用Scala提供的组合器。此外,您应该首先编写要使用的函数,然后应用输入
def compose[A,B,C](f: B => C, g: A => B): A => C = g.andThen(f)
def selfIter[T](f: T=>T, n: Int): T => T = Function.chain(List.fill(n)(f))
println(selfIter(compose(double, inc), 2)(2.0))
如果无法更改撰写签名,则
def compose[A,B,C](f: B => C, g: A => B, x: A): C = f(g(x))
def selfIter[T](f: T=>T, n: Int): T => T = Function.chain(List.fill(n)(f))
println(selfIter[Double](compose(double, inc, _), 2)(2.0))
但是它更有意义第一个解决方案解决这类问题最简单的方法是使用Scala提供的组合器。此外,您应该首先编写要使用的函数,然后应用输入
def compose[A,B,C](f: B => C, g: A => B): A => C = g.andThen(f)
def selfIter[T](f: T=>T, n: Int): T => T = Function.chain(List.fill(n)(f))
println(selfIter(compose(double, inc), 2)(2.0))
如果无法更改撰写签名,则
def compose[A,B,C](f: B => C, g: A => B, x: A): C = f(g(x))
def selfIter[T](f: T=>T, n: Int): T => T = Function.chain(List.fill(n)(f))
println(selfIter[Double](compose(double, inc, _), 2)(2.0))
但是第一个解决方案更有意义这里出现了一些问题 这个
f+selfIter(f,n-1)
表示f
(typeT
)必须有一个+
方法,该方法将另一个T
作为参数。但你不想添加这些东西,你想把它们组合起来
这里有一个更简单的方法来获得你想要的结果
Stream.iterate(2.0)(compose(double, inc, _))(2) // res0: Double = 14.0
如果您打算使用递归方法,这似乎可以实现您的目标
def selfIter[T](start:T, n:Int)(f:T=>T): T = {
if (n < 2) f(start)
else f(selfIter(start, n-1)(f))
}
selfIter(2.0, 2)(compose(double, inc, _)) // res0: Double = 14.0
def selfIter[T](开始:T,n:Int)(f:T=>T):T={
如果(n<2)f(启动)
其他f(自发光器(启动,n-1)(f))
}
selfIter(2.0,2)(compose(double,inc,)))//res0:double=14.0
这里有一些地方出了问题
这个f+selfIter(f,n-1)
表示f
(typeT
)必须有一个+
方法,该方法将另一个T
作为参数。但你不想添加这些东西,你想把它们组合起来
这里有一个更简单的方法来获得你想要的结果
Stream.iterate(2.0)(compose(double, inc, _))(2) // res0: Double = 14.0
如果您打算使用递归方法,这似乎可以实现您的目标
def selfIter[T](start:T, n:Int)(f:T=>T): T = {
if (n < 2) f(start)
else f(selfIter(start, n-1)(f))
}
selfIter(2.0, 2)(compose(double, inc, _)) // res0: Double = 14.0
def selfIter[T](开始:T,n:Int)(f:T=>T):T={
如果(n<2)f(启动)
其他f(自发光器(启动,n-1)(f))
}
selfIter(2.0,2)(compose(double,inc,)))//res0:double=14.0
如果不允许Im更改compose函数中的任何内容,该怎么办?我该怎么做呢?递归是解释compose中第三个参数的必要工具。为什么要使用u以及它如何与这个函数一起工作。chain和list.fill如果你看一下selfIter
方法,第一个参数的类型是T=>T,我们可以通过传递(v:Double)=>compose(Double,inc,v)
,这相当于compose(Double,inc,u)
如果不允许Im更改compose函数中的任何内容,该怎么办?我该怎么做呢?递归是解释compose中第三个参数的必要工具。为什么要使用u以及它如何与这个函数一起工作。chain和list.fill如果你看一下selfIter
方法,第一个参数的类型是T=>T,我们可以通过传递(v:Double)=>compose(Double,inc,v)
,这相当于compose(Double,inc,u)