小编Dan*_*iel的帖子

使用动态参数的方法重载解析

这可能是之前已经回答过的.我看到很多"动态方法重载解析"问题,但没有一个专门处理传递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)
  1. 为什么,因为类型不是静态知道的,它是否解决了过载接受dynamic
  2. 是否可以使用重载方法dynamic
  3. 解决这个问题的最佳方法是什么?

c# overloading dynamic overload-resolution

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

是否记录了双向前/后管道操作员?

我记得读过双管操作符 - ||>和<|| - 在某个地方,现在我不记得在哪里.我在MSDN或语言规范中找不到它们.他们在任何地方记录?

let print a b = sprintf "%O %O" a b
(1, 2) ||> print
// val it : string = "1 2"
Run Code Online (Sandbox Code Playgroud)

f#

7
推荐指数
1
解决办法
1204
查看次数

如何创建一个实现IDictionary <'K,'V>和IEnumerable <'V>的类型

我想创建一个只读的键控集合,它实现了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>.对象表达式可用于提供实现.还有其他想法吗?

f#

7
推荐指数
2
解决办法
451
查看次数

具有可为空列的复合外键

在下表中,是否有办法确保 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复制),复合外键不会强制执行此操作: …

sql-server referential-integrity foreign-keys

7
推荐指数
1
解决办法
3930
查看次数

有什么地方可以了解F#可能的未来吗?

是否有任何网站/博客(可能是由F#团队成员?)定期讨论/揭示有关F#未来的想法?

我知道一些团队成员的博客,但我找不到包含此类内容的博客.

f#

7
推荐指数
1
解决办法
531
查看次数

保持部分应用的功能通用

是否可以部分应用诸如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)

generics f# value-restriction

7
推荐指数
3
解决办法
1305
查看次数

F#核心库是否可以获得SQLCLR批准?

根据这个帖子,F#Core必须经SQLCLR批准才能标记组件SAFE.这是计划好的吗?甚至可以做到吗?

f# sqlclr

7
推荐指数
1
解决办法
418
查看次数

为Dictionary <'K,'V>键入扩展错误

以下类型扩展名

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)

现在我有一些奇怪的想法:只有在访问某些成员时才需要约束吗?

extension-methods f# dictionary

7
推荐指数
1
解决办法
458
查看次数

编写轮询Windows服务

我通常在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# windows-services backgroundworker

7
推荐指数
1
解决办法
1077
查看次数

已取消的任务不会将控制权返回到异步块

我试图把它减少到尽可能小的重复,但它仍然有点长,我道歉.

我有一个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# asynchronous task cancellation mailboxprocessor

7
推荐指数
1
解决办法
109
查看次数