小编Seh*_*cht的帖子

比较与泛型有关的工作方式

我偶然发现了一些"奇怪的行为".我使用F#interactive来测试一些代码并编写

Seq.zip "ACT" "GGA" |> Seq.map ((<||) compare)
// val it : seq<int> = seq [-1; -1; 1]
Run Code Online (Sandbox Code Playgroud)

然后我想用它制作一个函数并写下来

let compute xs ys = Seq.zip xs ys |> Seq.map ((<||) compare)
// val compute : xs:seq<'a> -> xs:seq<'a> -> seq<int> when 'a : comparison
Run Code Online (Sandbox Code Playgroud)

这推广了第一段代码,我认为这是件好事......直到我尝试使用它

compute "ACT" "GGA"
// val it : seq<int> = seq [-6; -4; 19]
Run Code Online (Sandbox Code Playgroud)

因此,compare当存在不同的"观点"(显式类型与泛型)时,以某种方式对"相同的事物"采取不同的行为

我知道如何解决它:要么通过明确的类型

let compute (xs: #seq<char>) // ... or char seq or string
Run Code Online (Sandbox Code Playgroud)

或者保持类型通用并与sign函数组合

let compute (* ... …
Run Code Online (Sandbox Code Playgroud)

generics comparison f#

13
推荐指数
1
解决办法
71
查看次数

总和类型的标准名称如Either但是3个案例?

是否存在类似Either的标准和类型,但有3种情况?Haskell有,These但不是那样.

f# ocaml haskell scala typescript

10
推荐指数
4
解决办法
706
查看次数

当存在不同的过载时,强制转发

这不是关于Windows窗体,它只是针对"背景".

当我遇到AddRange一个MenuStrip.Items需要ToolStripMenuItem投入的错误时,我正在玩Windows FormsToolStripItem

但是我已经有AddRange一个Form.Controls之前并不要求强制转换.

经过一些实验后,我设法发现当有多个重载时发生错误,AddRange所以我试图验证我的想法:

type Foo () = class end
type Bar () = inherit Foo ()

type FooCollection () = class end // not really necessary

type Test1 () =
  member __.AddRange (col: FooCollection) = () // could be an int or anything instead
  member __.AddRange (foos: Foo []) = ()

type Test2 () = member __.AddRange (foos: Foo []) = ()

let lst1, lst2 …
Run Code Online (Sandbox Code Playgroud)

f# casting overloading ambiguous-call overload-resolution

8
推荐指数
1
解决办法
89
查看次数

如何在查询XML时在LINQ中添加OR条件?

问题:返回所有记录where Jon Doe =<bus_contact> <bus_sponsor>.

当前代码返回记录1,因此仅使用一个查询返回记录1和2需要进行哪些修改?

XML

<root>
  <row>
    <project_id>1</project_id>
    <project_name>Name1</project_name>
    <bus_contact>Jon Doe</bus_contact>
    <bus_sponsor>Bruce Wayne</bus_sponsor>
  </row>
  <row>
    <project_id>2</project_id>
    <project_name>Name2</project_name>
    <bus_contact>Peter Parker</bus_contact>
    <bus_sponsor>Jon Doe</bus_sponsor>
  </row>
</root>
Run Code Online (Sandbox Code Playgroud)

C#

class Program
{
    static void Main (string[] args)
    {
        XElement main = XElement.Load ("master_list.xml");

        var results = main.Descendants ("row")
            .Descendants ("bus_contact")
            .Where (e => e.Value == "Jon Doe")
            .Select (e => e.Parent)               
            .Select (e => new {
                project_id = e.Descendants ("project_id").FirstOrDefault ().Value,
                project_name = e.Descendants ("project_name").FirstOrDefault ().Value
            });

        foreach (var result …
Run Code Online (Sandbox Code Playgroud)

c# xml linq

6
推荐指数
1
解决办法
155
查看次数