这可能是之前已经回答过的.我看到很多"动态方法重载解析"问题,但没有一个专门处理传递dynamic参数.在下面的代码中Test,最后一次调用M无法解析(它不能编译).错误是:[前两个重载M] 之间的调用不明确.
static void M(Func<int> f) { }
static void M(Func<string> f) { }
static void M(Func<dynamic> f) { }
static dynamic DynamicObject() {
return new object();
}
static void Test() {
M(() => 0);
M(() => "");
M(() => DynamicObject()); //doesn't compile
}
Run Code Online (Sandbox Code Playgroud)
dynamic?dynamic?我记得读过双管操作符 - ||>和<|| - 在某个地方,现在我不记得在哪里.我在MSDN或语言规范中找不到它们.他们在任何地方记录?
例
let print a b = sprintf "%O %O" a b
(1, 2) ||> print
// val it : string = "1 2"
Run Code Online (Sandbox Code Playgroud) 我想创建一个只读的键控集合,它实现了IDictionary <'K,'V>和IEnumerable <'V>.采取明显的方法我得到以下错误:
This type implements or inherits the same interface at different generic instantiations 'IEnumerable<'V>' and 'IEnumerable<KeyValuePair<'K,'V>>'. This is not permitted in this version of F#.
有没有不同的方法来实现这一目标?
编辑 - 由于这似乎是F#不可逾越的限制,实现这一目标的惯用方法是什么?想到的一个想法是提供返回所需数据视图的成员,例如成员x.List:IList <'V>和成员x.Dict:IDictionary <'K,'V>.对象表达式可用于提供实现.还有其他想法吗?
在下表中,是否有办法确保 PreviousID 始终引用具有匹配 ParentID 的行中的 ID,或者,如果 ParentID 为空,则它在引用的行中也为空?
CREATE TABLE MyTable (
ID int not null identity(1,1) primary key,
ParentID int null foreign key references MyTable (ID),
PreviousID int null foreign key reference MyTable (ID),
foreign key (ParentID, PreviousID) references MyTable (ParentID, ID)
)
Run Code Online (Sandbox Code Playgroud)
一个例子:
+-ID-+-ParentID-+-PreviousID-+ | 1 | 空 | 空 | | 2 | 1 | 空 | | 3 | 空 | 2 | <-- 应该不可能,应该引用 ParentID 为 null 的 ID +----+------------+------------+
有没有办法强制执行?
更新:对于那些想知道的人,由于以下原因(从MSDN复制),复合外键不会强制执行此操作: …
是否有任何网站/博客(可能是由F#团队成员?)定期讨论/揭示有关F#未来的想法?
我知道一些团队成员的博客,但我找不到包含此类内容的博客.
是否可以部分应用诸如bprintf并根据其初始使用限制其功能?
我想做以下事情:
let builder = new System.Text.StringBuilder()
let append = Printf.bprintf builder
append "%i" 10
append "%s" string_value
Run Code Online (Sandbox Code Playgroud) 根据这个帖子,F#Core必须经SQLCLR批准才能标记组件SAFE.这是计划好的吗?甚至可以做到吗?
以下类型扩展名
module Dict =
open System.Collections.Generic
type Dictionary<'K, 'V> with
member this.Difference(that:Dictionary<'K, 'T>) =
let dict = Dictionary()
for KeyValue(k, v) in this do
if not (that.ContainsKey(k)) then
dict.Add(k, v)
dict
Run Code Online (Sandbox Code Playgroud)
给出错误:
签名和实现不兼容,因为类型参数'TKey'的声明需要形式为'TKey:equality的约束
但是当我添加约束时,它会给出错误:
此类型扩展的声明类型参数与原始类型"Dictionary < , >" 上的声明类型参数不匹配
这尤其神秘,因为以下类型扩展没有约束并且有效.
type Dictionary<'K, 'V> with
member this.TryGet(key) =
match this.TryGetValue(key) with
| true, v -> Some v
| _ -> None
Run Code Online (Sandbox Code Playgroud)
现在我有一些奇怪的想法:只有在访问某些成员时才需要约束吗?
我通常在C#中编写Windows服务,但我在F#中使用它.对于像这样的轮询服务,我通常使用我写的类,类似于BackgroundWorker.它产生一个后台线程并定期触发OnWork方法.(完整代码在这里[github].)
在F#中有另一种,或许更好或更惯用的方法吗?它可能是编写轮询后台工作者类或内置替代方法的更好方法.
根据乔尔的建议,这就是我提出的问题.
module Async =
open System.Diagnostics
let poll interval work =
let sw = Stopwatch()
let rec loop() =
async {
sw.Restart()
work()
sw.Stop()
let elapsed = int sw.ElapsedMilliseconds
if elapsed < interval then
do! Async.Sleep(interval - elapsed)
return! loop()
}
loop()
//Example
open System.Threading
let cts = new CancellationTokenSource()
Async.Start(Async.poll 2000 (fun () -> printfn "%A" DateTime.Now), cts.Token)
Thread.Sleep(TimeSpan.FromSeconds(10.0))
cts.Cancel()
Run Code Online (Sandbox Code Playgroud)
该服务使用poll:
type MyService() =
inherit System.ServiceProcess.ServiceBase()
let …Run Code Online (Sandbox Code Playgroud) 我试图把它减少到尽可能小的重复,但它仍然有点长,我道歉.
我有一个F#项目引用一个C#项目,代码如下所示.
public static class CSharpClass {
public static async Task AsyncMethod(CancellationToken cancellationToken) {
await Task.Delay(3000);
cancellationToken.ThrowIfCancellationRequested();
}
}
Run Code Online (Sandbox Code Playgroud)
这是F#代码.
type Message =
| Work of CancellationToken
| Quit of AsyncReplyChannel<unit>
let mkAgent() = MailboxProcessor.Start <| fun inbox ->
let rec loop() = async {
let! msg = inbox.TryReceive(250)
match msg with
| Some (Work cancellationToken) ->
let! result =
CSharpClass.AsyncMethod(cancellationToken)
|> Async.AwaitTask
|> Async.Catch
// THIS POINT IS NEVER REACHED AFTER CANCELLATION
match result with
| Choice1Of2 _ -> …Run Code Online (Sandbox Code Playgroud) f# ×8
asynchronous ×1
c# ×1
cancellation ×1
dictionary ×1
dynamic ×1
foreign-keys ×1
generics ×1
overloading ×1
sql-server ×1
sqlclr ×1
task ×1