我们可以像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)
我可以以某种方式将复合类型解包为一个简单的元组吗?
我想实现以下目标:
在错误列表中将所有TypeScript lint警告显示为错误.
对于打开项目/解决方案的任何人,默认设置此项.
如果存在lint错误,则中断构建,即使使用独立的msbuild.exe也是如此.
这可能吗?到目前为止,我只能通过更改Web Essentials中的个人设置来获得显示为错误的警告,并且它们不会破坏构建.
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与上面的效率一样高效.
问题:
RemoveAllF#中效率最高的是什么?在SQLCMD中运行脚本时,是否有设置,参数或任何其他方法使其在每个SQL语句结束时有效地运行GO命令?
这样可以防止需要将定期GO命令插入到非常大的脚本中.
我正在努力学习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#方式.
我的问题是:
List<T>但我不确定这是否是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#类?或者我错过了什么?
我正在尝试为机器人模拟编写代码。对于方向,我有一个 DU:
type Direction = North | East | South | West
Run Code Online (Sandbox Code Playgroud)
当类型为South且您给出向右转两次的指令时,是否有一个选项使该值实际上再次从 开始North?
[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# ×6
.net ×1
c# ×1
intervals ×1
namedtuple ×1
range ×1
sql-server ×1
sqlcmd ×1
tree ×1
types ×1
typescript ×1