我想写一个转换链,最后有一个块,我在那里用生成的集合做一些事情,而不使用变量.在集合上是否有一个更高阶的函数,它只提供它被调用到所提供函数的集合?
Query( ... )
.map { ... }
.filter { ... }
.combinations(2)
.pipeTo { col =>
...
consolidate(col)
}
Run Code Online (Sandbox Code Playgroud)
当然对于单个函数调用,可以这样做:
consolidate(
Query()
.map { ... }
.filter { ... }
.combinations(2)
)
Run Code Online (Sandbox Code Playgroud)
但是前者对我来说更自然,并允许例如容易注入一些条件.
我一直在使用的解决方法是在最后放置一个匹配子句:
Query()
.map { ... }
.filter { ... }
.combinations(2)
match { case lst =>
...
consolidate(lst)
}
Run Code Online (Sandbox Code Playgroud)
但由于这种模式经常发生,我想知道写这个的惯用方法是什么.
是否有与Scala中使用的ADT模式的子类型的OO概念等效?特别是我想将方法添加到更专业的类型.例如,给定一个通用的List ADT:
sealed trait List[+A]
case class Cons[+A](h: A, t: List[A]) extends List[A]
case object Nil[Nothing]
Run Code Online (Sandbox Code Playgroud)
我想为特定类型的列表定义新方法:
sealed trait List[+A]
sealed trait DuckList extends List[Duck] {
def feed(l: DuckList) = ...
}
Run Code Online (Sandbox Code Playgroud)
但是我还必须为这些新类型定义特殊的数据构造函数(DuckCons,DuckNil),并且由于case类不支持(case-to-case)继承,所以没有办法将DuckCons与泛型相关联这样可以在模式匹配中工作,因此为List定义的泛型方法不适用于DuckList.
现在支持吗?我能找到的唯一信息是维基(https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching)中的示例,它会产生错误:
CompilerException java.lang.AssertionError:无效的列表语法(Red.(Red.axb)yc)in(Black.(Red.(Red.axb)yc)zd).有效语法:[[:default:guard] [:或:default] [:default:only] [:default:seq] [:default:when] [:default:as] [:default:<<] [:default :clojure.core.match /载体]]
我们正在考虑React用于DOM重型项目,并想要弄清楚虚拟DOM渲染方法的性能特征.
我担心的一件事是虚拟DOM在每次微小的状态变化时都会重新计算.我可以看到这个模型的好处,但是在一个包含大量元素和频繁的次要更新的应用程序中,这会导致很多开销,就像"悬停"效果一样简单.
例如,这会渲染一系列Ndiv并更改CSS类onMouseOver.在我的系统上,它变得非常缓慢N=5000(http://jsfiddle.net/estolua/aopvp7zp/).
var D = React.DOM;
function generateItems(N) {
return _.map(
_.range(0, N), function (i) { return { id: '_' + i, content: '' + i }; }
);
}
function toggle(x, y) { return (y && x!==y) ? y : null; }
var Item = React.createClass({
render: function () {
var item = this.props.item,
appS = this.props.appState,
focF = this.props.focF;
return D.div({
className: 'item' + (appS.focused === item.id ? ' …Run Code Online (Sandbox Code Playgroud) 我遇到了一个运行时错误,并想知道这是否是Scala中的错误,或者它是否至少应该在编译期间被捕获.此代码生成NullPointerException:
object Main extends App {
trait A {
val data: { val x: Int }
val x = data.x
}
val a = new A {
val data = new Object { val x = 42 }
}
a.x
}
Run Code Online (Sandbox Code Playgroud)
当然,通过使Axe懒惰或者很容易修复def,但是在这个最小的例子中可能很明显,在更现实的代码中,它可能有点令人困惑.
在"FP in Scala"一书中,有一种将ADT S用作抽象指令集的方法
sealed trait Console[_]
case class PrintLine(msg: String) extends Console[Unit]
case object ReadLine extends Console[String]
Run Code Online (Sandbox Code Playgroud)
并将它们组合在一起,Free[S, A]然后S将其转换为IO monad.这可以用Scalaz的Free类型完成吗?似乎所有run方法都需要一个仿函数实例S.
design-patterns functional-programming scala algebraic-data-types scalaz
有两个功能:
def f(a: String, b: Int): Int = a.length + b
val g: Int => String = _.toString
Run Code Online (Sandbox Code Playgroud)
为什么它,我可以组成一个部分地施加f与g通过中间分配的手段:
val f_ = f(_: String, 42)
f_ andThen g
// String => String = <function1>
Run Code Online (Sandbox Code Playgroud)
但不是直接:
f(_: String, 42) andThen g
// error: value andThen is not a member of Int
Run Code Online (Sandbox Code Playgroud)
这是类型推理器或某种预期行为的问题吗?
有关系
X | Y
-------
a | i
a | ii
b | ii
b | ii
Run Code Online (Sandbox Code Playgroud)
如何查询
X存在用于其一个Y长度2(应产生的{ a, b })X所有Y长度为2 的集合(应屈服{ b })