小编rmu*_*unn的帖子

如何在 MongoDB 中为不同的字段名称注册 ScalarDiscriminatorConvention?

我正在编写 C# 代码来从现有 MongoDB 数据库中提取数据并将其放入各种 C# 类中。数据库的一部分是多态的:如果字段type是 A,则该文档中将存在一组特定字段。如果type是B,则将存在一组不同的字段。这是 的完美用例ScalarDiscriminatorConvention,所以我正在使用ScalarDiscriminatorConvention("type"). 但我不知道如何让 MongoDB 驱动程序使用该约定!

关于约定的 MongoDB 手册页让我认为这可行:

var pack = new ConventionPack();
pack.Add(new CamelCaseElementNameConvention());
pack.Add(new ScalarDiscriminatorConvention("type"));

ConventionRegistry.Register(
    "My Custom Conventions",
    pack,
    t => t.FullName.StartsWith("MyNamespace."));
Run Code Online (Sandbox Code Playgroud)

但这会失败,因为它不像其他约定那样ScalarDiscriminatorConvention从接口派生。IConvention它派生自IDiscriminatorConvention,这是它自己的接口,但不派生自IConvention。并ConventionPack.Add期望一个IConvention参数。

那么如何注册不同的鉴别器字段呢?我已经翻阅 MongoDB 手册至少一个小时了,但我很茫然。他们似乎没有在我能找到的任何地方记录它。

c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

3
推荐指数
1
解决办法
1879
查看次数

FSharp.Data类型提供者和反射:如何检查XmlProvider类型的属性?

我正在尝试使用XmlProvider来解析一些非常大的数据文件(大约50 MB).由于它们太大,使用真实数据文件作为样本是不切实际的,所以我创建了一个示例XML文件,我希望它是可用数据的代表性样本.但是,我并不是100%确定我已经覆盖了50兆字节文件中的所有可能元素,所以我试图验证我的样本是否具有代表性.我正在尝试使用反射来帮助验证,但我遇到了一个问题.

一,背景.我不确定的原因是因为我正在解析的XML文件基本上具有以下(非常扁平的)数据结构:

<root-element>
<object class="Foo" guid="Guid001">
    <color>Brown</color>
    <shape>Square</shape>
    <children>
        <childRef guid="Guid003" />
    </children>
</object>
<object class="Bar" guid="Guid002">
    <firstName>John</firstName>
    <lastName>Smith</lastName>
</object>
<object class="Quux" guid="Guid003" parentGuid="Guid001">
    <secondaryColor>Maroon</secondaryColor>
    <stroke>Dashed</stroke>
    <shape>Circle</shape>
</object>
<object class="Quux" guid="Guid004">
    <color>Blue</color>
    <stroke>Dotted</stroke>
    <shape>Hexagon</shape>
</object>
</root-element>
Run Code Online (Sandbox Code Playgroud)

(在真实数据文件中,"Guid001"等是真正的GUID;但对于这个虚构的例子,我保持简单.)

基本上,它是一个包含大量object元素的平面数据文件,每个元素都来自该数据来自的程序中的C#类实例.元素半随机混合在一起,在同一数据文件中表示几个不同的类族.(这就是我的虚构数据文件将绘图形状与人物记录混合的原因 - 我正在使用的真实数据文件在单个文件中具有类似的关注点.)

正如我所说,我为我的代表性样本或多或少随机选择了一堆记录.我试图从每个班级中挑选至少一个,这样我就可以覆盖大部分属性名称,但是如果(例如)我最终选择Guid004用于Quux类而不是Guid003?然后我提供的类型实际上不知道该SecondaryColor属性.我想我可以.GetType()在我提供的类型上使用,然后调用.GetProperties()以获取我提供的类型认为它知道的所有属性的列表.但是当我这样做时:

let firstObject = rootElement.Objects[0]
printfn "%A" firstObject.GetType().GetProperties()
Run Code Online (Sandbox Code Playgroud)

相反,越来越命名属性的列表Color,Shape,Children,FirstName,等,我期待,我所得到的恰恰是2和性能,XElement_Print.

我想,我可以遍历XElement …

xml f# type-providers

3
推荐指数
1
解决办法
239
查看次数

轻松获取F#中的函数名称

在寻找答案时,我发现了几个与我的情况不太匹配的问题 - 所以我会问一个新问题.

我正在为数据结构编写一些FsCheck测试,我想在我构建的数据结构的每个副本上检查20个不同的属性.到目前为止我所做的是为每个属性编写一个谓词,然后我创建了一个谓词列表,我将依次调用它们List.forall,如下所示:

module PropertyChecks =
    let ``Tail length plus tree length should equal vector length`` vec =
        treeLength vec.root + Array.length vec.tail = vec.len

    let ``The tail may only be empty iff the vector is empty`` vec =
        (vec.len = 0) = (Array.length vec.tail = 0)

    let ``The tail's length may not exceed tailMax`` vec =
        Array.length vec.tail < tailMax

    let ``If vec.len <= tailMax, all items are in tail and root is empty`` vec = …
Run Code Online (Sandbox Code Playgroud)

reflection f#

3
推荐指数
1
解决办法
75
查看次数

F#创建字母和数字的随机字符串

我的以下代码有问题。我正在尝试创建字母和数字的随机字符串。下面的代码有效,但是每个会话只能创建1个随机字符串,因此,如果我再次调用randomNum,它将仍然保留创建的第一个随机字符串。

let randomNum(len : int) =

    let rand = new System.Random()
    let mutable str = ""
    let chars = "ABCDEFGHIJKLMNOPQRSTUVWUXYZ0123456789"
    let mutable count = 0

    for i in 1 .. len do
        count <- (rand.Next() % 36)

        str <- String.concat "" [str; chars.[count].ToString()]

    str
Run Code Online (Sandbox Code Playgroud)

有谁知道每次调用randomNum时创建随机字符串的简单方法。

谢谢

f#

2
推荐指数
1
解决办法
1523
查看次数

python正则表达匹配单引号

我尝试匹配下面的单引号:

s= "name:'abc','hello'"
Run Code Online (Sandbox Code Playgroud)

但似乎match/findall的行为是不同的:

re.match("\B'\w+'\B", s)   # ===> return None

re.findall("\B'\w+'\B", s)  #===> RETURN ['abc', 'hello']
Run Code Online (Sandbox Code Playgroud)

实际上这是由字符串中的单引号引起的,任何人都知道发生了什么?

我在win7中使用py2.7.8.

python regex

2
推荐指数
1
解决办法
933
查看次数

为什么foldBack没有执行折叠相同的副作用?

我是通过回答工作的不同的实例之间List.fold和List.foldBack试图让我周围的区别头部foldfoldBack.我现在理解应用程序顺序的差异,但是我不明白的副作用存在差异.

我用过List.foldList.foldBack测试.我的累加器函数基本上等同于::,因此累加顺序很重要.我使用的累加器函数如下:

let f acc x =
  // printfn "Folding %A into %A" x acc  // Side-effect!
  x :: acc

let f2 x acc =
  // printfn "Folding %A into %A" x acc  // Side-effect!
  x :: acc
Run Code Online (Sandbox Code Playgroud)

我从F#参考中了解到:

List.fold f [] [1; 2; 3; 4; 5] = (f (f (f (f (f [] 1) 2) 3) 4) 5)
Run Code Online (Sandbox Code Playgroud)

和:

List.foldBack f2 [] [1; 2; 3; 4; 5] …
Run Code Online (Sandbox Code Playgroud)

f# fold

2
推荐指数
1
解决办法
85
查看次数

我可以将'T []参数传递给想要obj []而不使用`Array.map box`的函数吗?

简短版本:

我需要在代码中调用函数我无法修改.该函数需要一个obj[],我想通过它'T[].我可以使用Array.map box,但我试图避免创建一个中间数组.是否有直接的方法将a转换'T[]obj[]不通过Array.map box或任何其他将创建中间数组的代码?

长版:

我正在尝试编写需要与FSharpx.Collections中PersistentVector类进行互操作的代码.(具体来说,我正在尝试在F#中实现RRB-Trees).PersistentVector基本上是一个B树,其分支因子为32.树中的每个节点都包含两个内容之一:其他节点(如果节点不是叶节点),或者存储在树中的项(如果节点)是一个叶子节点).现在,在F#中表示此数据结构的最自然的方式是使用类似的区分联合type Node<'T> = TreeNode of Node[] | LeafNode of 'T[].但是我认为是性能原因,FSharpx.Collections.PersistentVector代码定义了它的Node类,如下所示:

type Node(thread,array:obj[]) =
    let thread = thread
    new() = Node(ref null,Array.create Literals.blockSize null)
    with
        static member InCurrentThread() = Node(ref Thread.CurrentThread,Array.create Literals.blockSize null)
        member this.Array = array
        member this.Thread = thread
        member this.SetThread t = thread := t
Run Code Online (Sandbox Code Playgroud)

线程代码与我当前的问题无关(它在瞬态向量中使用,它允许某些性能改进),所以让我们删除它以便创建问题的最简单的摘要.删除与线程相关的代码后,我们有一个如下所示的Node定义:

type Node(array:obj[]) =
    new() = …
Run Code Online (Sandbox Code Playgroud)

arrays f# covariance

2
推荐指数
1
解决办法
90
查看次数

在进行并行计算时,为什么打印到控制台会混淆?

运行一些执行并行计算的代码时,输​​出变得混乱:不同的消息混淆了.这是一个示例:

Iteration 1
Iteration
Iteration 23 of 19 - Calculating P&L for test window ending at 10/28/1968 12:00:00 AM

 of
Iteration 4
Iteration  of
Iteration 5
Iteration
Iteration 19 - Calculating P&L for test window ending at  of 19 - Calculating P&L for test window ending at 5/29/1974 12:00:00 AM
6 of 878/18/1971 12:00:00 AM19 - Calculating P&L for test window ending at 3/4/1977 12:00:00 AM


 of 19 of
 of 19 - Calculating P&L for test window ending at 6/25/1985 …
Run Code Online (Sandbox Code Playgroud)

parallel-processing console f#

2
推荐指数
1
解决办法
111
查看次数

闭包语法错误F#

我正在尝试从存储库中实现以下C#代码:https://github.com/alexsorokoletov/Xamarin.iOS.DatePickerDialog

在F#中:

dialog.Show("Choose time", "Done", "Cancel", UIDatePickerMode.Time, (dt) =>
{
  TimePickLabel.Text = dt.ToString();
}, startingTime);
Run Code Online (Sandbox Code Playgroud)

但是,F#似乎只期望以下格式的3个参数:

在此输入图像描述

我理解如何填写titledatePickerMode参数,但是,我对回调有点困惑.我知道我应该使用fun语法,所以我尝试这样:

datePicker.Show("FROM", fun() -> (
        Console.WriteLine("Testing")
    ),UIDatePickerMode.Date)
Run Code Online (Sandbox Code Playgroud)

但这会引发错误:

表达式预计有类型,DateTimeunit在后面的括号中有类型fun.

c# f# closures functional-programming ios

2
推荐指数
1
解决办法
74
查看次数

如何在函数式编程中建模继承关系

面向对象的编程范例使用继承来建模遵循泛化 - 专业化关系的实体之间的关系.这里,Base类用于封装一组实体的公共(常规)属性和行为,Derived Classes 通过添加其他属性和/或添加/修改现有行为来扩展基类.

作为功​​能编程的新手,我需要在F#等函数语言中建模这种关系的指导.

例如,建模如下所示的简单情况的最佳方法是什么:

abstract class Tutorial { 
  private String topic;
  abstract public void learn();
}

class VideoTutorial extends Tutorial {
  private float duration;
  public void learn () {
    System.out.println ("read PDF");
  }
}

class PDFTutorial extends Tutorial {
  private int pageCount;
  public void learn () {
    System.out.println ("Watch Video");
  }
}
Run Code Online (Sandbox Code Playgroud)

然后使用教程集合并调用学习 观察多态行为.

oop inheritance f# functional-programming

2
推荐指数
1
解决办法
696
查看次数