小编The*_*Fox的帖子

展开F#单例区分联合元组类型

我们可以像type Address = Address of string使用展开功能一样展开类型

let unwrapAddress (Address a) = a
let addr = Address "sdf"
let str = unwrapAddress addr
Run Code Online (Sandbox Code Playgroud)

所以str类型string,但如果有这样的类型方法将无法正常工作:

type Composite = Composite of integer:int * someStr:string
let unwrap (Composite c) = c
Run Code Online (Sandbox Code Playgroud)

会产生错误

let unwrap (Composite c) = c;;
------------^^^^^^^^^^^
error FS0019: This constructor is applied to 1 argument(s) but expects 2
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式将复合类型解包为一个简单的元组吗?

f# discriminated-union namedtuple

8
推荐指数
3
解决办法
1509
查看次数

将TSLint警告视为Visual Studio 2013中的错误

我想实现以下目标:

  • 在错误列表中将所有TypeScript lint警告显示为错误.

  • 对于打开项目/解决方案的任何人,默认设置此项.

  • 如果存在lint错误,则中断构建,即使使用独立的msbuild.exe也是如此.

这可能吗?到目前为止,我只能通过更改Web Essentials中的个人设置来获得显示为错误的警告,并且它们不会破坏构建.

visual-studio typescript web-essentials

6
推荐指数
0
解决办法
415
查看次数

在F#中从地图中删除所有

C#:

在C#我有这样的事情:

IImmutableDictionary<string, string> map = new Dictionary<string, string>
{
    {"K1", "V1"},
    {"K2", "V2"},
    {"K3", "V3"},
}.ToImmutableDictionary();

IEnumerable<string> keys = new[] {"K1,K3"};

map = map.RemoveRange(keys);
Run Code Online (Sandbox Code Playgroud)

我假设ImmutableDictionary<K,V>.RemoveRange Method (IEnumerable<K>)引入了该方法,因为它比一系列Remove(K)调用更有效.它仅为每个keys要删除的元素创建一次生成的不可变对象,而不是一次.

F#:

什么是实现同样的最好方法F# .我想出了这个递归解决方案:

let rec removeAll (map:Map<string, string>,  keys:list<string>) =
    match keys with
        | [] -> map
        | _ -> removeAll(map.Remove(keys |> Seq.head), keys.Tail)     
Run Code Online (Sandbox Code Playgroud)

但我怀疑它RemoveRange与上面的效率一样高效.

问题:

  1. RemoveAllF#中效率最高的是什么?
  2. 你认为F#递归优化是否会编译成同样有效的东西?

.net c# f# immutable-collections

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

你能让SQLCMD立即在脚本中运行每个语句而不使用"GO"吗?

在SQLCMD中运行脚本时,是否有设置,参数或任何其他方法使其在每个SQL语句结束时有效地运行GO命令?

这样可以防止需要将定期GO命令插入到非常大的脚本中.

sql-server sqlcmd

5
推荐指数
1
解决办法
4970
查看次数

F#从CSV文件加载树

我正在努力学习F#,我真的很喜欢到目前为止我所看到的.我正在尝试将一些C#代码实现为F#思维方式,作为练习和学习的练习.

如果之前已经回答过,我真的很抱歉,但我找不到解决我所有问题的答案.

我们拥有销售队伍结构,我们有销售主管和普通销售人员.主管可能有也可能没有主管.

所有销售数据均来自CSV格式的其他系统.在阅读记录时,我们不知道SalesPerson是否有报告.

我似乎不明白如何在F#的不可变世界中加载树.我相信有办法.

我们简化的遗留C#代码定义(翻译成Enligsh)

public class SalesPerson
{
    public int Id { get; set; }
    public SalesPerson Supervisor { get; set; }
    public List<SalesPerson> Reports { get; private set; } = new List<SalesPerson>();
    public PersonalSales double { get; set; }
    public GroupSales double { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是代码的过度简化版本.但问题仍然存在:如何加载树?

我提出了以下F#类型

type SalesPerson = {
    Id : int
    Supervisor : SalesPerson option
    Reports : List<SalesPerson> option
    PersonalSales : double
    GroupSales : double
}
Run Code Online (Sandbox Code Playgroud)

我甚至不确定这是否是定义类型的F#方式.

我的问题是:

  1. 主管指向另一个SalesPerson,它是不可变的.如果它被新的替换(因为不可变数据有效),引用将会中断.
  2. 报告是不可改变的.我认为我可以使用C#,List<T>但我不确定这是否是F#方式. …

tree f#

5
推荐指数
1
解决办法
153
查看次数

具有至少一个元素的F#序列

F#的初学者在这里

我想创建一个类型,它是另一个具有至少一个元素的具体类型(Event)的序列.任何其他元素都可以在以后随时添加.通常在C#中我会创建一个带有私有List <Event>和公共方法的类.

但我想用功能方法来做,而不是模仿C#方法.或者至少尝试一下.

我的思路:

  • 让我们创建一个"seq"类型,并为它提供一个需要Event类型实例的构造函数

    type Event = Event of string
    
    type PublishedEvents = EventList of seq<Event> with
        static member create (event:Event) = EventList(Seq.singleton event)
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在让我们添加一个"添加"方法来添加另一个可选的Event实例

    type PublishedEvents with
        member this.add(event:Event) = Seq.append this [event]
    
    Run Code Online (Sandbox Code Playgroud)

但是这不起作用,F#抱怨"这个"与seq <'a>不兼容.

所以我尝试了这个:

type PublishedEvents with
    member this.add (event:Event) : PublishedEvents = EventList(Seq.append this [event])
Run Code Online (Sandbox Code Playgroud)

现在它抱怨"这个"与seq <Event>不兼容...这让我感到困惑,因为它上面几行说EventList of seq<Event>...所以我想我需要以某种方式转换EventList回来,seq<Event>以便我可以使用Seq.append

let convertFunction (eventList:PublishedEvents) : seq<Event> = ???
Run Code Online (Sandbox Code Playgroud)

但我不知道该怎么做.

我是否正朝着正确的方向前进?是否更好地模仿具有支持字段的C#类?或者我错过了什么?

f#

5
推荐指数
2
解决办法
193
查看次数

给定一个受歧视工会的案例,你能得到下一个案例吗?

我正在尝试为机器人模拟编写代码。对于方向,我有一个 DU:

type Direction = North | East | South | West
Run Code Online (Sandbox Code Playgroud)

当类型为South且您给出向右转两次的指令时,是否有一个选项使该值实际上再次从 开始North

f# types

3
推荐指数
1
解决办法
93
查看次数

F#:如何使用降序元素生成列表范围?

[1..4]可能有助于产生

[1;2;3;4]
Run Code Online (Sandbox Code Playgroud)

但我希望生成这样的范围:

[10;8;6;4;2]
Run Code Online (Sandbox Code Playgroud)

如何使用范围语义来实现这个(间隔+降序)?在这种情况下,"for"循环是强制性的吗?

非常感谢.

f# range intervals

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