在我每天用Java做的工作中,我使用构建器来进行流畅的接口,例如: new PizzaBuilder(Size.Large).onTopOf(Base.Cheesy).with(Ingredient.Ham).build();
使用快速而肮脏的Java方法,每个方法调用都会改变构建器实例并返回this
.不可避免地,它涉及更多的打字,在修改之前首先克隆构建器.构建方法最终会对构建器状态进行繁重的处理.
什么是在Scala中实现相同的好方法?
如果我想确保onTopOf(base:Base)
只调用一次,然后只调用with(ingredient:Ingredient)
并且build():Pizza
可以被称为a-la定向构建器,我将如何进行此操作?
我已经将IO monad描述为状态monad,状态是"现实世界".这种IO方法的支持者认为,这使IO操作变得纯粹,就像在引用透明时一样.这是为什么?从我的角度来看,IO monad中的代码似乎有很多可观察到的副作用.此外,是不是可以描述几乎任何非纯函数,如现实世界的功能?例如,我们不能想到,比方说,C的malloc是一个函数,它接受一个RealWorld和一个Int并返回一个指针和一个RealWorld,就像在Realmonorld隐含的IO monad中一样?
注意:我知道monad是什么以及它是如何使用的.请不要回复随机monad教程的链接,除非它专门解答我的问题.
在Scala中,从类中选择类型的语法与从类中选择其他任何类型的语法不同.前者使用散列作为选择运算符而不是点.这是为什么?
示例:如果我们有这样的类......
class Example {
type Foo = String
}
Run Code Online (Sandbox Code Playgroud)
为什么我们从这个类中选择类型......
val example:Example#Foo = "1"
Run Code Online (Sandbox Code Playgroud)
而不是像这样?
val example:Example.Foo = "1"
Run Code Online (Sandbox Code Playgroud) 为什么大多数Lisps和Schemes都是动态输入的?静态类型是否与其某些常见功能混合在一起?
在我所知道的面向对象语言中,除了C++和Objective-C之外,几乎所有语言都编译为在某种虚拟机上运行的字节码.为什么有这么多不同的语言在编译成字节码时,而不是机器码?在princible中是否可以使用高级内存管理的OOP语言编译为机器代码?
编辑:我知道多平台支持通常是这种方法的优势.但是,很有可能在多个平台上进行本机编译,而无需为每个平台创建新的编译器.每个例子都可以发出C代码然后用GCC编译.
我正在为静态类型的面向对象语言编写编译器.目前我正在研究垃圾收集算法.我想知道是否有一个收藏家:
编辑:为了澄清,我想知道是否有一个可实现的算法可以做到这一点,而不是有一个现成的收集器.
我一直在研究路径依赖类型.我能找到的最好的描述是:
如果L是类型标签,则xL和yL是相同类型iff x和y可以显示为引用同一对象.
这有时不是人们所期望的子类型行为.我希望如果上面例子中的L确实相同,那么就足以使xL和yL变得一致.
Scala是这样设计的,有什么特别的原因吗?
I am using mockito and trying to mock a scala object.
object Sample { }
//test
class SomeTest extends Specification with ScalaTest with Mockito {
"mocking should succeed" in {
val mockedSample = mock[Sample]
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我两个编译错误.
error: Not found type Sample
error: could not find implicit value for parameter m:
scala.reflect.ClassManifest[<error>]
Run Code Online (Sandbox Code Playgroud)
如果我将Sample从对象更改为类,则可以正常工作.有可能用mockito模拟scala对象吗?如果有,怎么样?
我听说Java字节码实际上不支持任何类型的未命名类.javac如何将未经修改的类转换为命名类?
我最近开始使用Atom.我遇到的一个问题是为Ruby定义了太多/不明确的片段.这会使标签更糟糕,因为您有时会获得一些不相关的代码而不是您想要的名称.我想知道如何关闭"语言Ruby"包中的特定片段,或者关闭所有片段的失败.最好不要完全禁用Ruby包.
我正在为我正在学习的课程编写一个简单的类C语言的编译器.这段代码:
int main() {
printInt(not(0));
return 0;
}
int not(int n) {
if (n == 0) {
return 1;
} else {
int result = 0;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
..我天真地编译到这个bitcode:
declare void @printInt(i32)
declare void @printDouble(double)
declare void @printString(i8*)
declare i32 @readInt()
declare double @readDouble()
define i32 @main() {
entry:
%0 = call i32 @not(i32 0)
call void @printInt(i32 %0)
ret i32 0
unreachable
}
define i32 @not(i32 %n_0) {
entry:
%0 = icmp eq i32 %n_0, 0
br …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试从cabal 安装BNF转换器,但是构建它时存在问题.显然,这个软件包使用了haskell98和基础版本4.*的混合模块.这提出了一个问题,如果您使用haskell98进行编译隐藏,则找不到某些模块.但是,如果你使用haskell98进行编译,那么ghc无法判断它是否应该使用新的Prelude或者haskell98 Prelude!
错误消息:
Main.hs:1:1:
Ambiguous module name `Prelude':
it was found in multiple packages: base haskell98-2.0.0.1
Run Code Online (Sandbox Code Playgroud)
你如何解决这样的错误?
我正在使用haskell编写一个小的lisp解释器.在此过程中,我定义了此数据类型,以获得较少类型的数字.
data Number = _Int Integer
| _Rational Rational
| _Float Double
deriving(Eq,Show)
Run Code Online (Sandbox Code Playgroud)
用拥抱编译它失败,出现以下错误:
错误"types.hs":16 - 数据类型声明中的语法错误(意外的"|")
第16行是|
上面代码中第一行的行.