我注意到Scala提供了lazy vals
.但我不知道他们做了什么.
scala> val x = 15
x: Int = 15
scala> lazy val y = 13
y: Int = <lazy>
scala> x
res0: Int = 15
scala> y
res1: Int = 13
Run Code Online (Sandbox Code Playgroud)
该REPL表明y
是一个lazy val
,但它是如何从一个正常的不同val
?
Akka Streams库已经提供了大量文档.然而,对我来说,主要的问题是它提供了太多的材料 - 我觉得我必须学习的概念数量让我感到非常不知所措.很多例子显示出非常重量级,并且不能轻易地翻译成现实世界的用例,因此非常深奥.我认为它提供了太多的细节而没有解释如何一起构建所有构建块以及它如何帮助解决特定问题.
有源,汇,流,图阶段,部分图,物化,图DSL和更多,我只是不知道从哪里开始.该快速入门指南,就是要一个首发位置,但我不明白.它只是抛出上面提到的概念而不解释它们.此外,代码示例无法执行 - 缺少部分使我或多或少无法遵循文本.
任何人都可以解释概念源,汇,流,图阶段,部分图,物化以及其他一些我用简单的单词和简单的例子来解释的东西,这些例子不能解释每一个细节(并且可能不需要在一开始)?
我想在eclipse中编辑多行,但我找不到任何捷径或插件.在Geany我只需按ctrl+ alt+ up/ down我就可以添加/编辑多行.
也许这个例子可以解释我的意思:
var text = "myname";
var addr = "myaddr";
var age = "myage";
Run Code Online (Sandbox Code Playgroud)
我想将上面的文字编辑成:
var my_text = "myname";
var my_addr = "myaddr";
var my_age = "myage";
Run Code Online (Sandbox Code Playgroud)
上面的文字只是一个简单的例子,但有时候我有很多行我需要编辑它的前缀.
有许多功能习语:monad,applicatives,arrows等.它们记录在不同的文章中,但不幸的是我不知道任何书籍或文章在一个地方汇总(有Typeclassopedia但它有很多没有很好覆盖的区域).任何人都可以推荐一篇文章/书籍,它可以在一个地方很好地覆盖它们,并且具有FP中级技能的程序员可以访问它吗?
val list = List(1,2,4,2,4,7,3,2,4)
Run Code Online (Sandbox Code Playgroud)
我想像这样实现它:( list.count(2)
返回3).
我听说Dynamic
在某种程度上可以在Scala中进行动态类型化.但我无法想象这可能是什么样子或它是如何工作的.
我发现一个人可以继承特质 Dynamic
class DynImpl extends Dynamic
Run Code Online (Sandbox Code Playgroud)
该API称,可以使用这样的:
foo.method("blah")~~> foo.applyDynamic("method")("blah")
但是当我尝试它时它不起作用:
scala> (new DynImpl).method("blah")
<console>:17: error: value applyDynamic is not a member of DynImpl
error after rewriting to new DynImpl().<applyDynamic: error>("method")
possible cause: maybe a wrong Dynamic method signature?
(new DynImpl).method("blah")
^
Run Code Online (Sandbox Code Playgroud)
这是完全合乎逻辑的,因为在查看来源之后,事实证明这个特征是完全空的.没有applyDynamic
定义方法,我无法想象如何自己实现它.
有人能告诉我我需要做些什么才能让它发挥作用吗?
我是Android开发的新手.是否可以在图像和TextViews
不同的Layout
XML文件中使用相同的ID ?
当eclipse自动为我列出它们时,它列出了项目中的所有布局变量,它会发生碰撞吗?直到现在我还没有注意到在不同布局中使用相同ID的任何问题,但我担心长远来看.
Haskell的类型推理引擎比Scala强大得多.在Haskell中,我很少需要显式地编写类型,而在Scala中,类型只能在表达式中推断,而不能在方法定义中推断.
例如,请参阅以下Haskell代码段:
size xs = loop xs 0
where
loop [] acc = acc
loop (_ : xs) acc = loop xs (acc+1)
Run Code Online (Sandbox Code Playgroud)
它返回List的大小.Haskell编译器可以识别使用的类型和函数定义.等效的Scala代码:
def size[A]: List[A] => Int = xs => {
def loop: (List[A], Int) => Int = {
case (Nil, acc) => acc
case (_ :: xs, acc) => loop(xs, acc+1)
}
loop(xs, 0)
}
Run Code Online (Sandbox Code Playgroud)
或者使用方法定义:
def size[A](xs: List[A]) = {
def loop(xs: List[A], acc: Int): Int = xs match {
case Nil => acc
case _ …
Run Code Online (Sandbox Code Playgroud) 我只是想知道为什么没有i++
增加一个数字.据我所知,Ruby或Python等语言不支持它,因为它们是动态类型的.所以显然我们不能写代码,i++
因为可能i
是字符串或其他东西.但Scala是静态类型的 - 编译器绝对可以推断出,如果合法或不合法地放置++
变量.
那么,为什么i++
Scala 中不存在?
我已经和Scala一起工作了一段时间,并且用它编写了10,000多行程序,但我仍然对一些内部工作感到困惑.我已经熟悉Java,C和Lisp后从Python来到Scala,但即使如此,它也很慢,而且一个巨大的问题是我在尝试研究对象/类型的内部工作时经常遇到的令人沮丧的困难/类/等.与Python相比,使用Scala REPL.在Python中,您可以查看任何对象foo
(类型,全局变量中的对象,内置函数等),foo
以查看事物的评估结果,type(foo)
显示其类型,dir(foo)
告诉您可以调用它的方法,以及help(foo)
获取内置文档.你甚至可以做一些事情,比如help("re")
查找名为re
(包含正则表达式对象和方法)的包的文档,即使没有与之关联的对象.
在Scala中,您可以尝试在线阅读文档,查看库中的源代码等,但对于您不知道在哪里甚至是什么的事情来说,这通常很难(而且经常是这样的)一大块咬掉,考虑到庞大的类型层次) -东西在不同的地方(包左右浮动scala
,Predef
各种隐式转换,像符号::
是几乎不可能谷歌).REPL应该是直接探索的方式,但实际上,事情更加神秘.说我看过foo
某个地方的引用,但我不知道它是什么.显然没有"使用REPL系统地调查Scala事物的指南",但以下是经过大量试验和错误后我拼凑起来的内容:
foo
是一个值(可能包括存储在变量中的内容以及伴随对象和其他Scala object
),您可以foo
直接进行评估.这应该告诉你结果的类型和价值.有时结果很有帮助,有时候不是.foo
是值,则可以使用它:type foo
来获取其类型.(不一定具有启发性.)如果在函数调用中使用它,则可以获得返回值的类型,而无需调用函数.foo
是值,则可以使用它foo.getClass
来获取其类.(通常比以前更有启发性,但对象的类与其类型有何不同?)foo
,你可以使用classOf[foo]
,虽然结果的含义并不明显.:javap foo
用来反汇编一个类 - 它应该是最有用的类,但对我来说完全失败.使用失败的示例:javap
:
scala> :javap List
Failed: Could not find class bytes for 'List'
Run Code Online (Sandbox Code Playgroud)
启发错误消息的示例:
scala> assert
<console>:8: error: ambiguous reference to overloaded definition, …
Run Code Online (Sandbox Code Playgroud)