ML模块系统是数据抽象的编程语言支持的高水准标记.但是,从表面上看,似乎可以很容易地在支持抽象类型成员的面向对象语言中进行编码.例如,我们可以在Scala中编码SML模块系统的元素,如下所示:
是否有任何重要的功能,如编码会错过?任何可以在SML模块中表达的编码都无法表达的东西?SML使得这种编码无法做出的任何保证?
我正在使用QuickCheck 1,我有以下数据类型:
data A = ...
instance Arbitrary A where ...
data B = ...
instance Arbitrary B where ...
data C = C A B
Run Code Online (Sandbox Code Playgroud)
现在,我想定义一个Arbitrary实例C,使C值是使用现有的发电机产生A和B.我最终这样做了:
instance Arbitrary C where
arbitrary = elements [(C a b) |
a <- generate 20 (System.Random.mkStdGen 0) arbitrary,
b <- generate 20 (System.Random.mkStdGen 0) arbitrary]
Run Code Online (Sandbox Code Playgroud)
这是明确生成固定数量的值A和B必要的,还是有更好的方法将现有的结合Arbitraries到一个新的?
在一个包含Scala测试的Java源代码和使用SBT 0.11.2构建的项目中,我按照说明将工件上传到Maven Central.这很好,除了scala-library被列为pom中的编译时依赖项,我不想要这样,因为它会导致我的库的用户将scala作为传递依赖项.有没有办法防止添加这种依赖?
我使用的确切build.sbt可以在github上看到.
是否有可能编写一个Haskell函数,该函数产生一个参数化类型,其中隐藏了确切的类型参数?就是这样的f :: T -> (exists a. U a)?显而易见的尝试:
{-# LANGUAGE ExistentialQuantification #-}
data D a = D a
data Wrap = forall a. Wrap (D a)
unwrap :: Wrap -> D a
unwrap (Wrap d) = d
Run Code Online (Sandbox Code Playgroud)
无法编译:
Couldn't match type `a1' with `a'
`a1' is a rigid type variable bound by
a pattern with constructor
Wrap :: forall a. D a -> Wrap,
in an equation for `unwrap'
at test.hs:8:9
`a' is a rigid type variable bound …Run Code Online (Sandbox Code Playgroud) 可能重复:
有条件地忽略JUnit 4中的测试
我有一套与Parameterized跑步者一起运行的系统测试,我想在不同的环境中运行.有些测试只能在非生产环境中运行,而且在生产中运行时我希望看到它们被忽略,所以我正在寻找一种说法:
@Test
public void dangerousTest() {
if (isProduction(environment)) ignore(); // JUnit doesn't provide ignore()
environment.launchMissilesAt(target);
assertThat(target, is(destroyed()));
}
Run Code Online (Sandbox Code Playgroud)
问题是JUnit没有提供ignore()在运行时忽略测试用例的方法.此外,Assume.assumeTrue(isNotProduction(environment))似乎不适用于Parameterized跑步者 - 它只是将测试标记为已通过,而不是被忽略.任何想法如何通过以下约束实现等效:
Parameterized跑步者我在Google App Engine上有两个应用程序,它们都在同一个帐户下运行,另一个通过HTTPS调用另一个应用程序提供的服务.确保只允许第一个应用程序调用第二个应用程序的推荐方法是什么?
或者,有没有办法指定给定端点只能由在相同GAE帐户下运行的应用程序调用?
我正在为在线游戏编写客户端UI.它被构造为表示游戏状态的Model模块和View模块,它跟踪当前游戏状态并使用模型转换(即从一个状态到另一个状态的功能)更新它.为了利用静态类型检查,我将状态建模为具有表示共同特征的类型类的不同类型:
class Erring s where errors :: s -> [String]
class WithPlayers s where players :: s -> [String]
class Erring s => LoggedIn s
data LoggedOut = LoggedOut [String] deriving (Eq, Show)
instance Erring LoggedOut where errors (LoggedOut es) = es
data Ready = Ready [String] [String] deriving (Eq, Show)
instance Erring Ready where errors (Ready _ es) = es
instance LoggedIn Ready
instance WithPlayers Ready where players (Ready ps _) = ps
data NotReady …Run Code Online (Sandbox Code Playgroud) 我反思性地调用一个方法,其参数可能是也可能不是值类的实例.由于值类的目的是避免基础值的装箱,如果参数类型是值类,那么所讨论的方法实际上将期望未装箱的值.为了处理这种情况,我试图从值类中解包基础值.我首先需要确定参数是否是值类,在这里我遇到了第一个绊脚石:
def isObjectOfValueClass(arg: Any) =
classOf[AnyVal].isAssignableFrom(arg.getClass)
Run Code Online (Sandbox Code Playgroud)
这不能按预期工作,因为该方法返回true:
case class NonValueClass(underlying: Int)
Run Code Online (Sandbox Code Playgroud)
如何isObjectOfValueClass实施?或者是否有一种更简单的方法来反射调用可能将值类的对象作为参数的方法?
Scala 2.8规范在7.3节中说明(突出显示是我的):
隐式参数和方法还可以定义称为视图的隐式转换.从类型S到类型T的视图由具有函数类型S => T或(=> S)=> T的隐式值或可转换为该类型的值的方法定义.视图适用于两种情况.
- 如果表达式e是T类型,并且T 不符合表达式的预期类型pt.在这种情况下,搜索隐式v,其适用于e并且其结果类型符合 pt.搜索按照隐式参数的情况进行,其中隐式范围是T => pt.如果找到这样的视图,则表达式e被转换为v(e).
[...]
鉴于以上事项和以下事实:
Long不是子类型java.lang.Comparable[Long],即不符合类型的T地方T <: java.lang.Comaparable[Long]Predef 包含 implicit def longWrapper (x: Long) : RichLongRichLong是一个子类型java.lang.Comparable[Long],即符合类型TwhereT <: java.lang.Comaparable[Long]我希望隐式转换应用于Long遇到的位置和java.lang.Comparable[Long]预期的子类型.然而:
scala> def test[T <: java.lang.Comparable[Long]](c: T) = println(c)
test: [T <: java.lang.Comparable[Long]](c: T)Unit
scala> test(12L)
<console>:7: error: inferred type arguments [Long] do not conform to method …Run Code Online (Sandbox Code Playgroud) Welcome to Scala version 2.10.1 (OpenJDK 64-Bit Server VM, Java 1.6.0_27).
Type in expressions to have them evaluated.
Type :help for more information.
scala> def o1: Option[Option[Unit]] = Some(()).map(Some(_))
o1: Option[Option[Unit]]
scala> o1
res0: Option[Option[Unit]] = Some(Some(()))
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都如预期.但是,如果我们忘记指定我们Option嵌套在一个Option?
scala> def o2: Option[Unit] = Some(()).map(Some(_))
o2: Option[Unit]
scala> o2
res1: Option[Unit] = Some(())
Run Code Online (Sandbox Code Playgroud)
为什么编译器会接受这个并隐含地将值展平?
我正在使用JConsole访问我的应用程序MBean,并使用password.properties文件.但根据Sun的规范,此文件仅包含明文格式的密码.
com.sun.management.jmxremote.password.file=<someLocation>/password.properties
现在我想加密密码并将其用于JConsole的JMX用户身份验证(Remote部分中的用户名和密码字段).我可以使用任何预定义的加密逻辑或我自己的加密算法.
有没有人知道任何这样的拦截将明文密码更改为加密密码,以便JMX Framework也知道加密密码?
我当前的密码文件:
guest guest
admin admin
Run Code Online (Sandbox Code Playgroud)
使用加密它应该看起来像:
guest ENC(RjqpRYbAOwbAfAEDBdHJ7Q4l/GO5IoJidZctNT5oG64=)
admin ENC(psg3EnDei6fVRuqHeLwOqNTgIWkwQTjI2+u2O7MXXWc=)
Run Code Online (Sandbox Code Playgroud) scala ×5
haskell ×3
java ×3
encryption ×1
http ×1
ignore ×1
jconsole ×1
jmx ×1
junit ×1
module ×1
oop ×1
passwords ×1
pom.xml ×1
quickcheck ×1
reflection ×1
sbt ×1
scala-2.10 ×1
security ×1
sml ×1
state ×1
value-class ×1