当我使用ScalaCheck的Gen.pic时,我观察到以下意外行为,对我而言,这表明它的选择并不是随机的,即使它的文档是这样说的:
/** A generator that picks a given number of elements from a list, randomly */
Run Code Online (Sandbox Code Playgroud)
在设置之后,我按顺序运行了以下三个小程序(在2天的时间内,在不同的时间,因为它可能很重要)
implicit override val generatorDrivenConfig = PropertyCheckConfig(
maxSize = 1000,
minSize = 1000,
minSuccessful = 1000)
Run Code Online (Sandbox Code Playgroud)
获得合适的样本量.
计划#1
val set = Set(1,2,3,4,5,6,7,8,9,10,
11,12,13,14,15,16,17,18,19,20,
21,22,23,24,25,26,27,28,29,30,
31,32,33,34,35,36,37,38,39,40,
41,42,43,44,45,46,47,48,49,50)
// Thanks to @Jubobs for the solution
// See: http://stackoverflow.com/a/43825913/4169924
val g = Gen.pick(3, set).map { _.toList }
forAll (g) { s => println(s) }
Run Code Online (Sandbox Code Playgroud)
在2个不同的运行中生成的3000个数字中,我得到了一个惊人的相似,非常随机的分布(数字是四舍五入的,只列出前5个,从这里开始的所有列表):
我使用C#创建通用Windows平台(UWP)应用程序服务提供程序,因为我想要使用的库只能在UWP应用程序中使用.
但是,我需要在F#中编写一个(控制台)应用程序,然后调用上面的UWP服务提供程序来利用该库.
根据https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/how-to-create-and-consume-an-app-service,如果服务提供商和消费者都可以这样做使用UWP编写C#(因为UWP中不支持F#).
我的问题是我是否可以从F#项目调用用C#编写的UWP应用程序服务?我可以创建一个包含两个项目的解决方案,其中一个是UWP C#app服务提供商,另一个是F#控制台应用服务消费者吗?
假设我在Scala中有n个值,类型分别为T ij的 v 1,v 2,...,v i,...,v n,它们对于不同的i不一定是不同的类型。我想使用自定义逻辑对n个值进行模式匹配。
一种方法是嵌套所有可能性,以防万一我需要穷举(出于本例的需要,否则,我可以使用占位符mag _c)并且不能合并分支(出于此目的)由于每个自定义逻辑都是唯一的,所以我不能这样做):
v1 match {
case x1: T11 => v2 match {
case x2: T21 => v3 match {
...
case xn_1: Tn_11 => vn match {
case xn: Tn1 => // Custom logic 1.
case xn: Tn2 => // Custom logic 2.
...
case xn: Tnk => // I am already laughing, but I have to write …Run Code Online (Sandbox Code Playgroud) 如何使用ScalaCheck从一组值(而不是生成器)生成n个唯一值(Gen[List[T]])的列表?这篇文章使用Gen[T]*而不是一组值,我似乎无法重写它以使其工作.
编辑
在@Jubobs的要求下,我现在可耻地展示了我到目前为止所做的一切,揭示了我在使用ScalaCheck时的全新状态:-)
我只是试图取代gs: Gen[T]重复参数到Set什么@Eric写的解决方案在这里:
def permute[T](n: Int, gs: Set[T]): Gen[Seq[T]] = {
val perm = Random.shuffle(gs.toList)
for {
is <- Gen.pick(n, 1 until gs.size)
xs <- Gen.sequence[List[T], T](is.toList.map(perm(_)))
} yield xs
}
Run Code Online (Sandbox Code Playgroud)
但是is.toList.map(perm(_))用红色强调,IntelliJ IDEA告诉我"你应该在盲目(虽然直观)试验和错误之前首先阅读ScalaCheck API",或者"类型不匹配,预期:Traversable [Gen [T]],实际列表[T ]",我不记得了.
我还尝试了其他几种方法,其中大多数我觉得很荒谬(因而不值得发布),最天真的是使用@Eric的(其他有用和整洁的)解决方案:
val g = for (i1 <- Gen.choose(0, myList1.length - 1);
i2 <- Gen.choose(0, myList2.length - 1))
yield new MyObject(myList1(i1), myList2(i2)) …Run Code Online (Sandbox Code Playgroud) Unchecked.defaultof<'T>为任何类型生成默认值.是否存在这样的通用函数来为具有最大/最小值的类型有意义的任何类型生成最大/最小值?
编辑
回答John Palmer关于我认为它有用的问题:我想创建以下函数的"可变"版本:
let InternalArrDiffMax (s : 'T []) (diff : 'T -> 'T -> 'C) =
s
|> Array.mapi (fun i e ->
[| for j in i + 1 .. s.Length - 1 -> diff e s.[j] |]
|> Array.maxBy (fun n -> n))
|> Array.maxBy (fun e -> e)
Run Code Online (Sandbox Code Playgroud)
由于我不能在没有为其赋值的情况下声明可变变量,我认为还有其他方法可以做到:
let InternalArrDiffMax (s : 'T []) (diffFun : 'T -> 'T -> 'C) =
let mutable max : 'C = // Generic max of 'C …Run Code Online (Sandbox Code Playgroud) 我在我引用的C#.NET DLL的MyClass命名空间的公共类中有以下枚举,MyNamespace并从F#模块打开:
public enum MyEnum {
ValueA,
ValueB,
ValueC}
Run Code Online (Sandbox Code Playgroud)
我想在我的F#模块中将字符串转换s为MyEnum等效字符串(如果可能)。试图像...
let myEnumValue = (MyClass.MyEnum) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)
...给我无效使用类型名称和/或对象构造函数的信息。如有必要,请使用“ new”并将构造函数应用于其参数...错误。如果使用typeof<MyClass.MyEnum>代替,则相同typedefof<MyClass.MyEnum>。试...
let myEnumValue = (typedefof<MyClass.MyEnum>) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)
...要么...
let myEnumValue = (typeof<MyClass.MyEnum>) (Enum.Parse(typedefof<MyClass.MyEnum>, s))
Run Code Online (Sandbox Code Playgroud)
...给我值不是函数,无法应用错误。
我MyEnum在我的F#代码的其他部分使用的都很好,所以我猜我的C#.NET DLL没有问题。
并避免一些可能的问题:-)
MyEnum使用.ToString()会将某些值序列化为XML,并且将从XML反序列化的枚举作为参数传递给F#函数。int等价MyEnum于XML的读写操作,因为XML应该是人类可读的,而且
值的int等价物MyClass比的等价物更可能更改.ToString()。尝试使用表驱动性能检查测试基于下面的例子中发现无效的参数组合在这里下测试无效的参数组合(在页面底部,should代之以must使用)ScalaTest 3.0.1,我的课堂延伸WordSpec with TableDrivenPropertyChecks with MustMatchers:
forAll (invalidCombos) { (n: Int, d: Int) =>
evaluating {
new Fraction(n, d)
} must produce [IllegalArgumentException]
}
Run Code Online (Sandbox Code Playgroud)
但是,IntelliJ IDEA cannot resolve symbol evaluating和cannot resolve symbol produce。现在检查1.8中的 MustMachers文档,我发现了evaluating和produce,但是在3.0.0或3.0.1中找不到。“ 迁移到3.0”页面对此没有任何说明。它们去了哪里,如何在ScalaTest 3中使用它们?
在Python中创建字符串集的差异时,我遇到了以下特殊行为:
set(['a', 'b']) - set(['a']) # results in {'b'} as expected
set(['a', 'b']) - set('a') # results in {'b'} as expected
set(['a.', 'b']) - set(['a.']) # results in {'b'} as expected
set(['a.', 'b']) - set('a.') # surprisingly results in {'a.', 'b'}!
Run Code Online (Sandbox Code Playgroud)
为什么在最后一种情况下是“ a”。不从集合中减去?由于第二种情况与第四种情况之间的区别是点,因此我认为这是罪魁祸首。使用双引号给出相同的行为。
我想创建一个函数,该函数使用来返回具有相同超类的Scala子类的运行时表示形式classOf,例如
class C
class C0 extends C
class C1 extends C
def f(i: Int): Class[C] = {
if (i % 2 == 0) classOf[C0]
else classOf[C1]
}
Run Code Online (Sandbox Code Playgroud)
但是,的返回值classOf[Cn]给我错误类型为classOf [Cn]的Expression并不能确认为期望的类型Class [C],给我的印象是继承信息丢失了Class[T]。
我认为ClassTag可以以某种方式帮助保留增加的类型,但是如何呢?