小编Dan*_*iel的帖子

完全限定名称,带有导入声明的非限定名称解析不同

这有效

open System
let f = Action(fun () -> Unchecked.defaultof<_>)
Run Code Online (Sandbox Code Playgroud)

但是这个

let f = System.Action(fun () -> Unchecked.defaultof<_>)
Run Code Online (Sandbox Code Playgroud)

产生编译错误

存在多种类型,称为"动作",采用不同数量的通用参数.提供一种类型的实例来消除歧义的类型的分辨率,例如, '操作< ,,_, ,,_, ,,_>'.

我知道我可以通过添加一个类型参数占位符(System.Action<_>(...))来修复它,但是知道它们为什么表现不同?

编辑

在规范第14.1.9节中找到了这个:

F打开模块或名称空间声明组时,项目将添加到名称环境中,如下所示:

  • 将类型添加到TypeNames表.如果该类型有一个CLI-错位通用名称,如List'1再一个条目下都加ListList'1.

是否为完全限定类型(省略了类型参数)复制了此行为?它似乎不是这样.

f#

11
推荐指数
1
解决办法
557
查看次数

避免嵌套模式匹配(可能与monad)

如何重写嵌套模式匹配(例如以下示例),以便None仅指定一次?我认为 Maybe monad解决了这个问题.F#核心库中有类似的东西吗?或者,有替代方法吗?

match a with
| Some b ->
    let c = b.SomeProperty
    match c with
    | Some d ->
        let e = d.SomeProperty
        //and so on...
    | None -> ()
| None -> ()
Run Code Online (Sandbox Code Playgroud)

f#

10
推荐指数
2
解决办法
2333
查看次数

使用sql_variant有什么陷阱?

我已多次阅读和听到sql_variant应该避免的事情.我想我有一个很好的用例.我varchar(max)过去曾用过在同一列中存储不同的类型,但是当内置类型完全符合我的要求时,避免de/serialization开销似乎是明智的.

那么,使用的缺陷到底什么sql_variant?它们是性能相关的,还是易于编程的错误,还是其他什么?顺便说一下,如果需要考虑的话,我将从客户端代码和CLR函数中与此列进行交互.

t-sql sql-server sql-server-2005 sqlclr variant

10
推荐指数
2
解决办法
1134
查看次数

以有效的方式查找未排序的重复项

我需要一种非常有效的方法来查找未排序序列中的重复项.这就是我提出的,但它有一些缺点,即它

  1. 不必要地计算超过2的事件
  2. 在产生重复之前消耗整个序列
  3. 创建几个中间序列

module Seq = 
  let duplicates items =
    items
    |> Seq.countBy id
    |> Seq.filter (snd >> ((<) 1))
    |> Seq.map fst
Run Code Online (Sandbox Code Playgroud)

无论缺点如何,我都没有理由用两倍的代码替换它.是否有可能通过相对简洁的代码来改善这一点?

algorithm performance ienumerable f#

10
推荐指数
2
解决办法
1484
查看次数

使用System.Uri添加多个段

var baseUri = new Uri("http://localhost/");
var uri1 = new Uri(baseUri, "1");
var uri2 = new Uri(uri1, "2");   
Run Code Online (Sandbox Code Playgroud)

出乎意料的uri2是,http:// localhost/2.我怎么会追加到uri1所以它的http://本地主机/ 1/2这一翻译?是否Uri做到这一点,或者我需要退回到字符串?顺便说一句,我试过几乎到处都添加前导/尾随斜杠.

c# uri

10
推荐指数
1
解决办法
7388
查看次数

将列表元素替换为反模式?

我有一个模块适用于表示为列表的路径.大多数函数都执行典型的递归列表处理,但现在我需要一个有时会改变路径的函数.所以,我写了这个replace函数:

module List =
  let replace f sub xs = 
    let rec finish acc = function
      | [] -> acc
      | x::xs -> finish (x::acc) xs
    let rec search acc = function
      | [] -> None
      | x::xs -> 
        if f x then Some(finish ((sub x)::xs) acc)
        else search (x::acc) xs
    search [] xs
Run Code Online (Sandbox Code Playgroud)

其工作方式如下:

let xs = List.init 10 id
let res = List.replace ((=) 5) (fun _ -> -1) xs
//Some [0; 1; 2; 3; 4; …
Run Code Online (Sandbox Code Playgroud)

f# anti-patterns list

10
推荐指数
2
解决办法
3249
查看次数

F# - 公共文字

有没有办法在类型上定义公共文字(C#中的公共const)?显然,类型中的绑定必须是私有的,并且Literal属性不能应用于成员.

f#

9
推荐指数
1
解决办法
961
查看次数

从F#实现C#相等运算符

是否有可能为F#中的C#相等(==)运算符提供实现?

编辑:

这段代码:

static member (=) (left : Foo, right : Foo) =
Run Code Online (Sandbox Code Playgroud)

生成编译器警告:

The name '(=)' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name 'op_Equality' instead.

后一部分解决了我试图做的事情.知道为什么op_Equality简单地受到青睐(=)

f# equality operator-overloading

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

使用JavaScriptSerializer序列化字典

显然,IDictionary<string,object>被序列化为KeyValuePair对象数组(例如[{Key:"foo", Value:"bar"}, ...]).是否可以将其序列化为对象(例如{foo:"bar"})?

c# serialization json javascriptserializer

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

在F#3.0中打破活动模式

这个活动模式使用F#2.0编译:

let (|Value|_|) value = // 'a -> 'T option
  match box value with
  | :? 'T as x -> Some x
  | _ -> None
Run Code Online (Sandbox Code Playgroud)

但是,在F#3.0中,发出错误:

活动模式'|值| _ |' 具有包含不由输入确定的类型变量的结果类型.当没有提到结果案例时,常见原因是[sic],例如'let(| A | B |)(x:int)= A x'.这可以通过类型约束来修复,例如'let(| A | B |)(x:int):Choice = A x'

我试过了:

let (|Value|_|) value : 'T option = ...
Run Code Online (Sandbox Code Playgroud)

和:

let (|Value|_|) (value: 'U) = ...
Run Code Online (Sandbox Code Playgroud)

怎么修好?

环境:Visual Studio 2012(RTM)和FSI v11.0.50727.1

编辑:这是一个更简单的repro:

let (|X|) x = unbox x
Run Code Online (Sandbox Code Playgroud)

f# active-pattern f#-3.0 visual-studio-2012

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