- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 scala 非常陌生,并且正在寻求适应 scala 特定模式。
目标是将消息处理和消息生成分开。存在表示消息处理的基本协变参数化类型。具体实现可以通过常规的mixin组合,也可以通过底层协议(protocol)的混合实现。
要求是:
trait Protocol
trait Handler [+proto <: Protocol] {
def handle : PartialFunction[Protocol,Unit]
/* can not name the actual protocol type since handler for a subtype also fully supports handling supertype
besides any message extends other subtype ot the supertype since the scala use matching with case classes
and these algebraic type realization is seemed excluded from strait scala type system
*/
}
/*
==============
using scenario
==============
*/
trait SumMsg extends Protocol
case class Sum(op : Int) extends SumMsg
case class Sub(op : Int) extends SumMsg
trait ProdMsg extends Protocol
case class Mul(op : Int) extends ProdMsg
case class Diff(op : Int) extends ProdMsg {
require (0 != op, "Division by zero is not permited")
}
/* stackable traites */
trait NullHandler {
def handle : PartialFunction[Protocol,Unit] = { case _ => {} }
}
trait SumHandler extends Handler [SumMsg] with NullHandler{
var store : Int
abstract override def handle : PartialFunction[Protocol,Unit] = ({
case Sum(op) => { this.store += op}
case Sub(op) => { this.store -= op}
}: PartialFunction[Protocol,Unit]) orElse super.handle
}
trait MulHandler extends Handler [ProdMsg] with NullHandler{
var store : Int
abstract override def handle : PartialFunction[Protocol,Unit] = ({
case Mul(op) => {this.store *= op}
case Diff(op) => {this.store /= op}
}: PartialFunction[Protocol,Unit]) orElse super.handle
}
/* concrete classes */
class SumAccum (var store: Int) extends SumHandler
class MulAccum (var store: Int) extends MulHandler
class ArithmAccum (var store: Int) extends SumHandler with MulHandler
/* producers */
class ProduceSums (val accum : Handler [SumMsg]) {
var state : Boolean = true
def touch() = if (this.state)
{
this.state = false
this.accum.handle(Sum(2))
} else {
this.state = true
this.accum.handle(Sub(1))
}
}
class ProduceProds (val accum : Handler [ProdMsg]) {
var state : Boolean = true
def touch() = if (this.state)
{
this.state = false
this.accum.handle(Mul(2))
} else {
this.state = true
this.accum.handle(Diff(2))
}
}
/* tying together via cake pattern */
trait ProtocolComp {
type Proto <: Protocol
}
trait ProducerComp { this: ProtocolComp =>
type ProducerT <: {def touch()}
def getProducer(accum : Handler[Proto]) : ProducerT
}
trait HandlerComp { this: ProtocolComp =>
type HandlerT <: Handler[Proto]
def getHandler(store:Int) : HandlerT
}
trait AppComp extends ProtocolComp with ProducerComp with HandlerComp {
val initStore = 1
def test() {
val handler = getHandler(initStore)
val producer = getProducer(handler)
producer.touch()
}
}
/* different examples of compositions */
/* correct usage */
object One extends AppComp{
override type Proto = SumMsg
override type ProducerT = ProduceSums
override type HandlerT = SumAccum
override def getProducer(accum : Handler[Proto]) = new ProduceSums(accum)
override def getHandler(store : Int) = new SumAccum(store)
}
object Two extends AppComp{
override type Proto = SumMsg
override type ProducerT = ProduceSums
override type HandlerT = ArithmAccum
override def getProducer(accum : Handler[Proto]) = new ProduceSums(accum)
override def getHandler(store : Int) = new ArithmAccum(store)
}
object Three extends AppComp{
override type Proto = SumMsg with ProdMsg
override type ProducerT = ProduceSums
override type HandlerT = ArithmAccum
override def getProducer(accum : Handler[Proto]) = new ProduceSums(accum)
override def getHandler(store : Int) = new ArithmAccum(store)
}
/* incorrect usage
static type checking protects from some kind of logic errors
*/
object Four extends AppComp{
override type Proto = SumMsg
override type ProducerT = ProduceProds
override type HandlerT = SumAccum
override def getProducer(accum : Handler[Proto]) = new ProduceProds(accum)
override def getHandler(store : Int) = new SumAccum(store)
}
mixed.scala:140: error: type mismatch;
found : Handler[Four.Proto]
required: Handler[ProdMsg]
override def getProducer(accum : Handler[Proto]) = new ProduceProds(accum)
mixed.scala:53: error: illegal inheritance;
class ArithmAccum inherits different type instances of trait Handler:
Handler[ProdMsg] and Handler[SumMsg]
class ArithmAccum (var store: Int) extends SumHandler with MulHandler
最佳答案
您的问题不是 JVM 的类型删除,而是 Scala 使用线性化来解决继承问题。
从 Handler 中移除类型参数 [+proto <: Protocol]。无论如何,handle 方法不使用它。那么你的非法继承错误就会消失。
关于design-patterns - 具有相同参数化类型的 Scala mixin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6637933/
这个问题在这里已经有了答案: Difference between / and /* in servlet mapping url pattern (5 个回答) 4年前关闭。 web.xml 中的/
Scala 具有支持模式匹配中析取的语言功能(“模式替代”): x match { case _: String | _: Int => case _ => } 但是,如果审查满足 P
解释我的问题: 类别:玩具 特质 1:说话像男性 特质2:说话像女性 我能否在运行时更改 Toy 的行为(特征),以便有时同一个对象说话像男性,有时同一个对象说话像女性? 我想在运行时改变说话行为。
我已经能够找到很好的资源,这些资源告诉我 Java API 中的 MouseAdapter 没有使用适配器模式。问题是:MouseAdapter 是否实现了某种模式? 我知道它的作用:它为 Mouse
我有兴趣了解有关模式识别的更多信息。我知道这是一个广泛的领域,所以我将列出一些我想学习处理的特定类型的问题: 在看似随机的字节集中查找模式。 识别图像中的已知形状(例如圆形和正方形)。 注意给定位置流
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
所以,问题很简单:在 awk 中,if (var ~/pattern/) 是否与 if (var ~ "pattern") 相同? 我已经对 csv 进行了一些基本测试,两者似乎都产生了相同的结果..
我的问题是 this 的 Scala (Java) 变体Python 上的查询。 特别是,我有一个字符串 val myStr = "Shall we meet at, let's say, 8:45
我最近一直在研究正则表达式并注意到了这一点。 Pattern pNoEmbed = Pattern.compile("[ a-z]+", Pattern.CASE_INSENSITIVE); Patt
在研究大型应用程序的 C++ 源代码时,我发现了这种模式(该示例的语法可能很粗略,但基本细节都在那里): class A : X friend B; B *parent; ...
有人可以举一个“中介者模式”在现实世界中有用的用例吗? 最佳答案 Mediator是一种添加第三方对象以控制一组(2 个或更多)对象之间交互的方法。 您能找到的最简单的示例是 Chat Room例如,
尝试编译以下代码片段时: type 'a frame = Empty | Frame of string * 'a * 'a frame let rec searchFrame f s = match
目标 我的目标是获得一个 servlet 过滤器来处理对主页的请求,然后再将它们转发到 index.jsp。 问题 我无法让过滤器接收来自“/”的请求。它的 URL 模式是 / 相反,对该模式的请求最
这个问题已经有答案了: Difference between / and /* in servlet mapping url pattern (5 个回答) 已关闭 6 年前。 我已经设置了一个具有此
第 6 章(代码重用模式)中有以下示例: // the parent constructor function Parent(name) { this.name = name || 'Adam
Pattern类中的pattern()方法和toString()方法有什么区别? 文档说: public String pattern() Returns the regular expression
我有脚本 here并且 ng-pattern 工作正常,因为 scope.subnet 仅在输入匹配模式后才显示在输出中。但是如果 ng-pattern 不匹配,ng-show 不会显示任何错误
我想知道为什么当提供相同的正则表达式和相同的字符串时,java regex pattern.matcher() 和 pattern.matches() 的结果会不同 String str = "hel
This SO answer引用“患有模式综合症的小男孩”。虽然我可以通过上下文推断出一些含义,但我并不完全理解。 “有模式综合症的小男孩”的良好定义是什么? 最佳答案 它只是意味着寻找将模式注入(i
我有以下微服务架构的用例。 我的问题是,在当前情况下,我有 3 个微服务和一个 APIGateway。 最后,网关必须在聚合(组合)来自 3 个服务的数据之前进行大量查询。因为这 3 个微服务只提供基
我是一名优秀的程序员,十分优秀!