据我所知,在这篇博文 中,Scala中的"类型类"只是一个用特征和隐式适配器实现的"模式".
正如博客所说,如果我有特征A和适配器,B -> A那么我可以调用一个函数,它需要类型A的参数,参数类型B而不显式调用此适配器.
我发现它很好但不是特别有用.您能给出一个用例/示例,它显示了此功能的用途吗?
可能重复:
JSLint:在定义之前使用过
我跑JSlint,看到这样的错误:
'foo' is not defined. var x = foo();
foo是另一个JavaScript文件中定义的函数foo.js.据我所知,没有"import/require"指令JavaScript来引用foo另一个源文件中定义的函数.
如何修复此错误JSlint?
为什么使用foreach,map,flatMap等是不是用认为是更好的get斯卡拉选项?如果我使用isEmpty我可以get安全地打电话.
我想(一般来说)我的理解shift和reset意思.但是我不明白他们为什么如此命名?什么shift和reset分隔继续原语与英语中的"移位"和"重置"单词有什么关系?
我正在考虑以下示例来说明为什么逆变是有用的.
让我们考虑一个GUI框架Widgets,Events和Event Listeners.
abstract class Event;
class KeyEvent extends Event
class MouseEvent extends Event
trait EventListener[-E] { def listen(e:E) }Run Code Online (Sandbox Code Playgroud)
我们Widgets定义以下方法:
def addKeyEventListener(listener:EventListener[KeyEvent])
def addMouseEventListener(listener:EventListener[MouseEvent])
Run Code Online (Sandbox Code Playgroud)
这些方法只接受"特定"事件监听器,这很好.但是我想定义"kitchen-sink"监听器,它们监听所有事件,并将这些监听器传递给上面的"添加监听器"方法.
例如,我想定义LogEventListener记录所有传入的事件
class LogEventListener extends EventListener[Event] {
def listen(e:Event) { log(event) }
}Run Code Online (Sandbox Code Playgroud)
由于特征EventListener是逆变的,Event我们可以传递LogEventListener给所有那些"添加监听器"方法而不会失去其类型安全性.
是否有意义 ?
我想在我的所有公共方法中添加"trace"消息,如下所示:
public void foo(s:String, n:int) { // log is a log4j logger or any other library
log.trace(String.format("Enter foo with s: %s, n: %d", s, n))
...
log.trace("Exit foo")
}
现在我想log.trace用AOP(和字节码检测)自动将所有这些添加到我的方法中.我在考虑AspectJ.是否有意义?你知道任何开放源代码吗?
假设我有一个元组列表List[(A, B)].将其转换为multimap映射A到的a的最佳方法是什么Set[B]?我可以构建一个不可变的 multimap吗?
这是一个面试问题.在BST中找到第二个最大值.
最大元素是BST中最右边的叶子.第二个最大值是其父或其左子.因此解决方案是遍历BST以找到最右边的叶子并检查其父和左子.
是否有意义?
language-agnostic algorithm binary-search-tree data-structures
为什么git命令要切换名为git checkout?的分支?
它真的有意义吗?
我会改名git switch.此外,git checkout还有其他含义:例如还原文件(如svn revert)
我编写了一个函数来枚举给定列表的所有排列.您如何看待下面的代码?
def interleave(x:Int, l:List[Int]):List[List[Int]] = {
l match {
case Nil => List(List(x))
case (head::tail) =>
(x :: head :: tail) :: interleave(x, tail).map(head :: _)
}
}
def permutations(l:List[Int]):List[List[Int]] = {
l match {
case Nil => List(List())
case (head::tail) =>
for(p0 <- permutations(tail); p1 <- interleave(head, p0)) yield p1
}
}
Run Code Online (Sandbox Code Playgroud) scala ×6
algorithm ×1
aop ×1
aspectj ×1
git ×1
git-checkout ×1
implicit ×1
java ×1
javascript ×1
jslint ×1
logging ×1
multimap ×1
permutation ×1
scala-option ×1