相关疑难解决方法(0)

如何将enrich-my-library模式应用于Scala集合?

一个Scala中最强大的模式是充实,我的图书馆*模式,它采用隐式转换为出现添加方法,以现有的类,而不需要动态方法解析.例如,如果我们希望所有字符串都有spaces计算他们有多少个空格字符的方法,我们可以:

class SpaceCounter(s: String) {
  def spaces = s.count(_.isWhitespace)
}
implicit def string_counts_spaces(s: String) = new SpaceCounter(s)

scala> "How many spaces do I have?".spaces
res1: Int = 5
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种模式在处理泛型集合时遇到了麻烦.例如,已经询问了许多关于按顺序对项目进行分组的问题.没有内置的东西可以一次性工作,所以这似乎是使用泛型集合C和泛型元素类型的rich-my-library模式的理想候选者A:

class SequentiallyGroupingCollection[A, C[A] <: Seq[A]](ca: C[A]) {
  def groupIdentical: C[C[A]] = {
    if (ca.isEmpty) C.empty[C[A]]
    else {
      val first = ca.head
      val (same,rest) = ca.span(_ == first)
      same +: (new SequentiallyGroupingCollection(rest)).groupIdentical
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,除了它不起作用.REPL告诉我们:

<console>:12: error: not found: …
Run Code Online (Sandbox Code Playgroud)

collections scala enrich-my-library

92
推荐指数
3
解决办法
6354
查看次数

在State monad上实现递归关系(在Haskell或Scala中)

我正在http://www.thalesians.com/archive/public/academic/finance/papers/Zumbach_2000.pdf中对运营商进行新的实施 编辑:此处的解释更清楚:https : //www.olseninvest.com/客户/pdf/paper/001207-emaOfEma.pdf

简而言之,它是一堆基于指数移动平均值的递归关系的很酷的时间序列运算符,其中ema()运算符的每个应用都采用新值和ema的先前结果。我似乎无法在此堆栈交换上进行乳胶操作,但是无论如何我现在的问题是软件问题。

我在Scala中通过在创建EMA函数的thunk中隐藏了一个变量来实现了这一点。所有这些都可以,但是非常棘手,因为再次调用ema(5)然后再次调用ema(5)自然会导致不同的结果。我想使用State Monads重做所有这些操作,但是我很快就迷失了自己。

例如,我在Haskell中具有以下简化的EMA State monad:

import Control.Monad.State

type EMAState = Double
type Tau = Double

ema :: Tau -> Double -> State EMAState Double
ema tau x = state $ \y ->
  let alpha = 1 / tau
      mu = exp(-alpha)
      mu' = 1 - mu
      y' = (mu * y) + (mu' * x)
  in (y', y')
Run Code Online (Sandbox Code Playgroud)

我可以在GHCI中轻松测试:

*Main Control.Monad.State> runState (ema 5 10) 0
(1.8126924692201818,1.8126924692201818)
Run Code Online (Sandbox Code Playgroud)

将输入10应用于初始化为0的5周期EMA。这很好,使用forM可以应用多个输入值,等等。现在,下一步是实现“迭代EMA”,即应用的EMA自己N次。

iEMA[n](x) = EMA(iEMA[n-1](x)) …
Run Code Online (Sandbox Code Playgroud)

monads recurrence haskell state-monad moving-average

5
推荐指数
1
解决办法
314
查看次数