这有效
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再一个条目下都加List和List'1.
是否为完全限定类型(省略了类型参数)复制了此行为?它似乎不是这样.
如何重写嵌套模式匹配(例如以下示例),以便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) 我已多次阅读和听到sql_variant应该避免的事情.我想我有一个很好的用例.我varchar(max)过去曾用过在同一列中存储不同的类型,但是当内置类型完全符合我的要求时,避免de/serialization开销似乎是明智的.
那么,使用的缺陷到底是什么sql_variant?它们是性能相关的,还是易于编程的错误,还是其他什么?顺便说一下,如果需要考虑的话,我将从客户端代码和CLR函数中与此列进行交互.
我需要一种非常有效的方法来查找未排序序列中的重复项.这就是我提出的,但它有一些缺点,即它
module Seq =
let duplicates items =
items
|> Seq.countBy id
|> Seq.filter (snd >> ((<) 1))
|> Seq.map fst
Run Code Online (Sandbox Code Playgroud)
无论缺点如何,我都没有理由用两倍的代码替换它.是否有可能通过相对简洁的代码来改善这一点?
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做到这一点,或者我需要退回到字符串?顺便说一句,我试过几乎到处都添加前导/尾随斜杠.
我有一个模块适用于表示为列表的路径.大多数函数都执行典型的递归列表处理,但现在我需要一个有时会改变路径的函数.所以,我写了这个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#中的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简单地受到青睐(=)?
显然,IDictionary<string,object>被序列化为KeyValuePair对象数组(例如[{Key:"foo", Value:"bar"}, ...]).是否可以将其序列化为对象(例如{foo:"bar"})?
这个活动模式使用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# ×7
c# ×2
algorithm ×1
equality ×1
f#-3.0 ×1
ienumerable ×1
json ×1
list ×1
performance ×1
sql-server ×1
sqlclr ×1
t-sql ×1
uri ×1
variant ×1