加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

将以更有效的方式(scalaz)使用Scala会带来性能/可维护性的惩罚?

发布时间:2020-12-16 09:31:38 所属栏目:安全 来源:网络整理
导读:我目前正在开发一个主要是纯粹的小项目(10k loc),但主要依赖于迭代器和重型计算的一些数据结构重用的可变优化。 我想学习更多的功能性编程,并希望获得更多的类型安全性,例如将可变计算包装到状态变压器单体等中。为此,存在scalaz库。 问题一 通过使用所
我目前正在开发一个主要是纯粹的小项目(<10k loc),但主要依赖于迭代器和重型计算的一些数据结构重用的可变优化。 我想学习更多的功能性编程,并希望获得更多的类型安全性,例如将可变计算包装到状态变压器单体等中。为此,存在scalaz库。 问题一 通过使用所有花哨功能的东西来抽象我的计算,我会介绍一下我不会摆脱的性能杀手吗?喜欢当我的计算包裹在Monads的膝盖? 问题二 考虑到Scala的有限类型推论,是否可行?我目前正在与非常大的类型签名进行战斗(可能是因为我不知道如何正确摆脱它们)。我认为,更多的“功能性”将引入更多的这种锅炉版代码。 放弃 我不是质疑功能方法是好是坏。对Haskell提出这个问题是毫无意义的。我在质疑Scala是否合理。 根据要求编辑:我的项目中的大型签名的示例 (但这将是一个不同的问题) 以下代码描述了类型参数化输入对象(DiscreteFactorGraph [VariableType,FactorType [VariableType]])上的迭代计算。您可以使用createInitialState构建一个计算对象,并使用advanceState对其进行计算,最后从边缘提取一些信息。 我想要在计算过程中保留因子图对象的类型(及其参数类型),以便边缘的最终应用产生正确类型的DiscreteMarginals [VariableType]。我认为目前我只需要在计算类型(即TState)中保留变量类型,因此不使用因子类型。但是在不同的地方,我甚至需要DiscreteFactorGraph的类型是可变的,所以我希望将来需要更多的类型信息通过计算。 我很喜欢这部分,我希望有更好的解决方案。目前我有一个非常实用的方法,只有这三个功能。但我必须通过它们链接类型。或者,我可以将其定义为一个类,并使用所有这些类型对类进行参数化,因此我不必为每个方法重复类型参数。

object FloodingBeliefPropagationStepper extends SteppingGraphInferer {
  def marginals[V <: DiscreteVariable,F <: DiscreteFactor[V]](state: FloodingBeliefPropagationStepper.TState[V,F]): DiscreteMarginals[V] =
    BeliefPropagation.marginals(state._1,state._2)

  def advanceState[V <: DiscreteVariable,F]): FloodingBeliefPropagationStepper.TState[V,F] = {
    val graph = state._1
    (graph,BeliefPropagation.computeFactorMessages(
      graph,BeliefPropagation.computeVariableMessages(graph,state._2,graph.variables),graph.factors))
  }

  def createInitialState[V <: DiscreteVariable,F <: DiscreteFactor[V]](graph: DiscreteFactorGraph[V,F],query: Set[V],random: Random): FloodingBeliefPropagationStepper.TState[V,F] = {
    (graph,BeliefPropagation.createInitialVariableMessages(graph,random),graph.factors))
  }

  type TState[V <: DiscreteVariable,F <: DiscreteFactor[V]] = (DiscreteFactorGraph[V,Map[(F,V),DiscreteMessage])
}

解决方法

关于问题一:

通过将您的计算包装到单子,应用程序,函子和其他功能性伏特加将会有一些开销。但是,将计算包装到程序,方法,对象中也是如此。

问题的核心是计算量有多小,所以包装开始变得明显。没有人知道你的项目的一些细节,没有人会告诉你的。然而,由于Scala的混合性质,你不必一路走下去。很可能使用类似scalaz的样式用于计算的更高级别的组合,并且在性能需要时使用本地包含的可变状态。

关于问题二:

既然我没有你的类型签名的性质的线索,如果scalaz会通过泛化计算来帮助你,或者你必须打开Scala对局部类型构造函数应用程序的有限支持。

如果您的类型签名失控,我建议您尝试在包对象中声明类型别名并使用它们。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读