我刚刚完成了Scala编程,我一直在研究Scala 2.7和2.8之间的变化.似乎最重要的一个是continuation插件,但我不明白它对它有用或它是如何工作的.我已经看到它对异步I/O很有用,但我还是找不到原因.关于这个主题的一些更受欢迎的资源是:
关于Stack Overflow的这个问题:
不幸的是,这些引用中没有一个试图定义什么是continuation或者shift/reset函数应该做什么,而且我没有找到任何引用.我无法猜测链接文章中的任何示例是如何工作的(或者他们做了什么),因此帮助我的一种方法可能是逐行浏览其中一个示例.即使是第三篇文章中的简单文章:
reset {
...
shift { k: (Int=>Int) => // The continuation k will be the '_ + 1' below.
k(7)
} + 1
}
// Result: 8
Run Code Online (Sandbox Code Playgroud)
为什么结果是8?这可能会帮助我开始.
我刚读过Deprecating the Observer Pattern并发现它非常吸引人.
文档中描述的Scala.React包的状态是什么?我找到了一个Scala.React快照的tarball,但似乎没有太多文档或主动维护.我还发现了ScalaFX,看起来它可能与反应式编程有关,但同样没有维护.
是否有任何项目以本文中的想法为基础,创建基于被动反应的GUI框架?
我正在尝试学习Scala,我想通过编写一个简单的swing应用来学习,但我不确定在功能世界中GUI编程是什么样的,特别是在使用Scala时.
来自OO/Java背景的任何指针,教程或陷阱都非常受欢迎.
我试图在WPF/silverlight数据绑定中使用数据绑定看到一种更清晰的替代方案(对于Scala来说是惯用的) - 即实现INotifyPropertyChanged.首先,一些背景:
在.Net WPF或silverlight应用程序中,您具有双向数据绑定的概念(即,将UI的某些元素的值绑定到DataContext的.net属性,以便更改为UI元素影响属性,反之亦然.实现这一点的一种方法是在DataContext中实现INotifyPropertyChanged接口.不幸的是,这为你添加到"ModelView"类型的任何属性引入了很多样板代码.这是它的外观在斯卡拉:
trait IDrawable extends INotifyPropertyChanged
{
protected var drawOrder : Int = 0
def DrawOrder : Int = drawOrder
def DrawOrder_=(value : Int) {
if(drawOrder != value) {
drawOrder = value
OnPropertyChanged("DrawOrder")
}
}
protected var visible : Boolean = true
def Visible : Boolean = visible
def Visible_=(value: Boolean) = {
if(visible != value) {
visible = value
OnPropertyChanged("Visible")
}
}
def Mutate() : Unit = {
if(Visible) {
DrawOrder += 1 // Should trigger …Run Code Online (Sandbox Code Playgroud) 我目前正在玩Scala开发,但我需要与诸如box2d之类的库集成来处理物理.问题是,这需要依赖于管理其自身状态的外部库.您可以跟踪传递到box2d世界的物体.总结一下有用的方面:
所以我的问题是:
如何以优雅的方式跟踪这些引用(用于函数式编程),以及如何在代码的其余部分中最小化它对纯度的影响?
像国家单子这样的东西在这里我不会帮助我
haskell functional-programming scala referential-transparency
我正在寻找使用Scala构建管道模式.我希望在编写管道对象后,它们可以像这样连接在一起:
Pipeline1 :: Pipeline2 :: Pipeline3 ...
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试了一些想法.有些工作,有些则没有.但它们似乎都没有完全摆脱样板代码.以下是我最接近的.
首先定义Pipeline和Source抽象类:
// I is the input type and O is the output type of the pipeline
abstract class Pipeline[I, +O](p: Pipeline[_, _ <: I]) {
val source = p
val name: String
def produce(): O
def stats():String
}
abstract class Source[+T] extends Pipeline[AnyRef, T](null)
Run Code Online (Sandbox Code Playgroud)
接下来,我创建了两个管道并尝试将它们链接在一起
// this creates a random integer
class RandomInteger extends Source[Int] {
override val name = "randInt"
def produce() = {
scala.Math.round(scala.Math.random.asInstanceOf[Float] * 10)
}
def stats()="this pipeline …Run Code Online (Sandbox Code Playgroud)