首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用函数库scala

问调用函数库scala
EN

Stack Overflow用户
提问于 2020-03-01 18:30:55
回答 1查看 104关注 0票数 0

我希望从ta-lib的scala包装器中调用ATR函数。但是我不知道如何正确使用包装器。

代码语言:javascript
复制
package io.github.patceev.talib

import com.tictactec.ta.lib.{Core, MInteger, RetCode}

import scala.concurrent.Future

object Volatility {
    def ATR(
        highs: Vector[Double],
        lows: Vector[Double],
        closes: Vector[Double],
        period: Int = 14
    )(implicit core: Core): Future[Vector[Double]] = {
        val arrSize = highs.length - period + 1

        if (arrSize < 0) {
            Future.successful(Vector.empty[Double])
        } else {
            val begin = new MInteger()
            val length = new MInteger()
            val result = Array.ofDim[Double](arrSize)

            core.atr(
                0, highs.length - 1, highs.toArray, lows.toArray, closes.toArray,
                period, begin, length, result
            ) match {
                case RetCode.Success =>
                    Future.successful(result.toVector)
                case error =>
                    Future.failed(new Exception(error.toString))
            }
        }
    }
}

有没有人可以解释一下如何使用函数并将结果打印到控制台。

在此之前,非常感谢您。

EN

回答 1

Stack Overflow用户

发布于 2020-03-01 20:21:00

关于语法,Scala是许多语言中的一种,在这些语言中,您可以调用函数和方法,并在括号中传递参数(大多数情况下,但现在让我们保持简单):

代码语言:javascript
复制
def myFunction(a: Int): Int = a + 1

myFunction(1) // myFunction is called and returns 2

最重要的是,Scala允许指定多个参数列表,如以下示例所示:

代码语言:javascript
复制
def myCurriedFunction(a: Int)(b: Int): Int = a + b

myCurriedFunction(2)(3) // myCurriedFunction returns 5

您也可以部分应用myCurriedFunction,但同样,让我们暂时保持简单。其主要思想是您可以将多个参数列表传递给一个函数。

在此基础上,Scala允许定义一个隐式参数列表,编译器将根据一些作用域规则自动检索这些参数。例如,Future使用隐式参数:

代码语言:javascript
复制
// this defines how and where callbacks are run
// the compiler will automatically "inject" them for you where needed
implicit val ec: ExecutionContext = concurrent.ExecutionContext.global

Future(4).map(_ + 1) // this will eventually result in a Future(5)

请注意,Future和map都有第二个参数列表,允许指定隐式执行上下文。通过在作用域中使用它,编译器将在调用点为您“注入”它,而不必显式编写它。你仍然可以这样做,结果会是

代码语言:javascript
复制
Future(4)(ec).map(_ + 1)(ec)

也就是说,我不知道您正在使用的库的细节,但其思想是您必须实例化一个Core类型的值,并将其绑定到implicit val或显式传递它。

生成的代码如下所示

代码语言:javascript
复制
val highs: Vector[Double] = ???
val lows: Vector[Double] = ???
val closes: Vector[Double] = ???
implicit val core: Core = ??? // instantiate core
val resultsFuture = Volatility.ATR(highs, lows, closes) // core is passed implicitly
for (results <- resultsFuture; result <- results) {
  println(result)
}

请注意,根据您的情况,您可能还必须使用隐式ExecutionContext来运行此代码(因为您是从Future中提取Vector[Double] )。选择正确的执行上下文是另一种问题,但为了解决这个问题,您可能希望使用全局执行上下文。

额外的

关于我留下的一些观点,这里有一些建议,希望能被证明是有用的:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60474163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档