我正在观看Runar Bjarnason的初学者函数式编程,并在14:45他定义了一个方法:
def isDivisibleBy(k: Int): Int => Boolean = i => i % k == 0
Run Code Online (Sandbox Code Playgroud)
和功能:
val isEven = isDivisibleBy(2)
Run Code Online (Sandbox Code Playgroud)
定义isEven为函数而不是方法的优点和缺点是什么?
我已经阅读了Scala函数与方法以及Scala中方法和函数之间的区别,并且我理解语义差异,但我想知道在这种情况下是否有更深层次的原因为什么函数可能或可能不优于使用方法:
def isEven = isDivisibleBy(2)
Run Code Online (Sandbox Code Playgroud) 鉴于以下测试套件:
class ParallelizeMe extends FunSuite with BeforeAndAfterAll {
override def beforeAll() = println("before")
override def afterAll() = println("after")
test("test 1") {
println("1a")
Thread.sleep(3000)
println("1b")
}
test("test 2") {
println("2a")
Thread.sleep(1000)
println("2b")
}
}
Run Code Online (Sandbox Code Playgroud)
如何并行运行测试(通过sbt)?理想情况下,我希望执行顺序在stdout上生成以下内容:
before
1a
2a
2b
1b
after
Run Code Online (Sandbox Code Playgroud) 以下两个函数的类型有什么区别?
def add1: Int => Int => Int = a => b => a + b
def add2(a: Int)(b: Int) = a + b
Run Code Online (Sandbox Code Playgroud)
根据他们的声明,他们似乎有相同的类型.两者都以相同的方式调用:
scala> add1(1)(2)
res2: Int = 3
scala> add2(1)(2)
res3: Int = 3
Run Code Online (Sandbox Code Playgroud)
但是,它们的类型存在明显差异:
scala> :t add1
Int => Int => Int
scala> :t add2
(a: Int)(b: Int)Int
Run Code Online (Sandbox Code Playgroud)
另外,部分应用add1比有点清洁add2.
scala> add1(1)
res4: Int => Int = <function1>
scala> add2(1)(_)
res5: Int => Int = <function1>
Run Code Online (Sandbox Code Playgroud) 有没有办法告诉irssi我想自动加入当前打开的所有频道?
我想要的东西:
/channel add -auto <all my currently open channels>
/save
Run Code Online (Sandbox Code Playgroud) TL; DR:当与会者为活动建议了新的时间时,组织者是否可以通过Google Calendar API检索建议的新时间,例如从Events:get或Events:list?
当组织者通过“ 事件:获取”和“ 事件:列表” API 检索上述事件时,他们看到的只是与会者具有临时响应状态。没有什么可以表明已经提出了新的时间,也没有什么可以表明的:
{
...,
"kind": "calendar#event",
"organizer": {
"email": "organizer@example.com",
"self": true
},
"start": {
"dateTime": "2019-09-17T17:00:00-04:00"
},
"end": {
"dateTime": "2019-09-17T17:30:00-04:00"
},
"attendees": [
{
"email": "attendee@example.com",
"responseStatus": "tentative"
},
{
"email": "organizer@example.com",
"organizer": true,
"self": true,
"responseStatus": "accepted"
}
],
...
}
Run Code Online (Sandbox Code Playgroud) 给定以下类模式匹配:
clazz match {
case MyClass => someMethod[MyClass]
}
Run Code Online (Sandbox Code Playgroud)
是否可以根据模式匹配的内容以通用方式引用MyClass?例如,如果我有MyClass的多个子类,我可以编写一个简单的模式匹配来将匹配的类型传递给someMethod:
clazz match {
case m <: MyClass => someMethod[m]
}
Run Code Online (Sandbox Code Playgroud) 给定以下类型和实例:
type operation = (Int, Int) => Int
def add: operation = _ + _
Run Code Online (Sandbox Code Playgroud)
如果我尝试匹配case语句中的操作,Scala会因为类型擦除而抱怨未经检查的键入:
for (a <- elements) a match {
case o: operation => // do stuff
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这种基于函数的打字,同时在case语句中易于擦除?
注意,这与此线程类似.