我正在寻找相当于C#的default关键字,例如:
public T GetNext()
{
T temp = default(T);
...
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一段代码,我需要弄清楚一个给定的类型是否实现IEnumerable<T>(我不关心T)
我试过了(t:System.Type万一你想知道)
let interfaces = t.GetInterfaces()
let enumerbale =
interfaces.Any(fun t ->
t.GetGenericTypeDefinition() = typeof<IEnumerable<>>
)
Run Code Online (Sandbox Code Playgroud)
但是这不会编译(编译不喜欢<>).然后我试过了
let interfaces = t.GetInterfaces()
let enumerbale =
interfaces.Any(fun t ->
t.GetGenericTypeDefinition() = typeof<IEnumerable<'a>>
)
Run Code Online (Sandbox Code Playgroud)
但得到一个警告,'a是对obj的约束.我不想弄清楚是否IEnumerable<obj>已实施但是IEnumerabl<>.
任何人都知道解决方案,顺便也可以对上面的代码发表评论.
在C#我可以这样做:
var castValue = inputValue as Type1
Run Code Online (Sandbox Code Playgroud)
在F#中,我可以这样做:
let staticValue = inputValue :> Type1
let dynamicValue = inputValue :?> Type1
Run Code Online (Sandbox Code Playgroud)
但它们都不等同于C#的关键字as.
我想我需要为F#中的等价物做一个匹配表达式
match inputValue with
| :? Type1 as type1Value -> type1Value
| _ -> null
Run Code Online (Sandbox Code Playgroud)
它是否正确?
这是F#中抽象成员的典型声明:
abstract member createEmployee : string -> string -> Employee
Run Code Online (Sandbox Code Playgroud)
您可以定义参数类型,但不能定义其名称.没有名称,在实现接口时如何判断每个参数是什么?换句话说,您如何知道接口是否希望实现为1-或2-?
1- member this.createEmployee firstName lastName = ...
2- member this.createEmployee lastName firstName = ...
Run Code Online (Sandbox Code Playgroud)
我是从错误的角度看待问题(习惯于C#)吗?
所以我有以下代码:
// Learn more about F# at http://fsharp.net
open System
open System.Linq
open Microsoft.FSharp.Collections
let a = [1; 2; 3; 4; 54; 9]
let c = a |> List.map(fun(x) -> x*3) |> List.filter(fun(x) -> x > 10)
let d = a.Select(fun(x) -> x*3).Where(fun(x) -> x > 10)
for i in c do
Console.WriteLine(i)
for i in d do
Console.WriteLine(i)
Run Code Online (Sandbox Code Playgroud)
两者似乎做同样的事情,但我看到的大多数F#例子都使用了|>管道运算符,而我更习惯于方法链接(ala C#Linq).后者也稍微短一些,虽然稍微嘎吱作响.目前我正在使用C#Linq语法,但这更多是习惯/惯性而不是任何真正的设计决策.
是否有任何我应该了解的考虑因素,或者它们基本相同?
编辑:另一个考虑因素是管道语法比Linq语法明显更"嘈杂":我正在做的操作(例如"map")非常短而且是小写的,而每一个前面都有这个巨大的"|>列出"除了使它更长时间分散注意力远离微小的小写方法名称.甚至StackOverflow的语法高亮显示也突出了错误(不相关)的事情.无论是那个还是我都不习惯它.
我需要通过几个相关项目设置要在AssemblyVersion属性中使用的版本号.
在C#中我使用以下内容
public class Constants {
public const string Version = "1.2.3.4";
}
Run Code Online (Sandbox Code Playgroud)
然后它可以使用如下:
[assembly:AssemblyVersion(Constants.Version)]
Run Code Online (Sandbox Code Playgroud)
F#中的等价结构是什么.我试图提出一个可以作为属性参数接受的绑定的尝试都没有用.
在C#中,您可以将文件放在与其命名空间相对应的文件夹中,并在解决方案资源管理器中查看它们.
在F#中,似乎我必须将所有内容放在简单有序的列表中进行编译.当我达到~300级的规模时,它会让人感到有些困惑和混乱,我开始羡慕C#,并认为它可能是类型推断的代价.
有没有比拆分成几个组件更好的选择?
由F#编译器的源来看它的路线,他们已经采取,但我有互联组件(控制器视图,> 300类 - - 视图模型)的相当大的系统,我想是因为在循环依赖的一个组件,即使在接口水平.
我应该忘记一个文件 - 一个类并创建一些巨大的文件?(例如,在F#编译器中,您有几个100kb到300kb范围内的源文件,并且有些自动生成1Mb左右!)
您对大型F#项目的体验是什么?
我已经谷歌搜索了一段时间......好吧,对不起,这个很简单,但是F#中有一个运算符来比较类类型,比如C#中的'is'关键字?我不想使用完整的匹配声明或开始铸造东西.干杯
使用C#中的F#Discriminated Unions的最佳方法是什么?
我一直在深入研究这个问题,我可能找到了最简单的方法,但由于它相当复杂,可能还有其他一些我看不到的东西......
有一个有区别的联盟,例如:
type Shape =
| Rectangle of float * float
| Circle of float
Run Code Online (Sandbox Code Playgroud)
我发现C#的用法是(避免使用变量,使类型明显):
Shape circle = Shape.NewCircle(5.0);
if (circle.IsCircle)
{
Shape.Circle c = (Shape.Circle)circle;
double radius = c.Item;
}
Run Code Online (Sandbox Code Playgroud)
在C#中,NewXXXX静态方法总是创建Shape类的对象,还有一种方法IsXXXX来检查对象是否属于该类型; 当且仅当它是,它可以转换为Shape.XXXX类,并且只有它的项目可访问; Shape.XXXX类的构造函数是内部的,即无法访问.
有人知道从一个受歧视的联盟获取数据的更简单的选择吗?
我想知道这是否是一个太广泛的问题,但最近我让自己遇到了一段我想确定如何从C#转换为适当的F#的代码.旅程从这里开始(1)(TPL-F#交互的原始问题),并继续这里(2)(我正在考虑转换为F#的一些示例代码).
示例代码在这里重现的时间太长,但有趣的功能是ActivateAsync,RefreshHubs和AddHub.特别有趣的是
AddHub有签名private async Task AddHub(string address).RefreshHubsAddHub在循环中调用并收集一个列表tasks,然后它在最后等待await Task.WhenAll(tasks),因此返回值与其签名匹配private async Task RefreshHubs(object _).RefreshHubs被称为ActivateAsync一样await RefreshHubs(null),然后在年底有一个叫await base.ActivateAsync()匹配函数签名public override async Task ActivateAsync().题:
将这些函数签名正确转换为F#仍然保持接口和功能并尊重默认的自定义调度程序是什么?而且我也不太确定这个"在F#中异步/等待".至于如何"机械地"做到这一点.:)
原因是在链接"here(1)"中似乎存在问题(我没有验证这一点),因为F#异步操作不遵循(Orleans)运行时设置的自定义协作调度程序.此外,这里声明TPL操作逃脱调度程序并进入任务池,因此禁止使用它们.
我能想到解决这个问题的一种方法是使用F#函数,如下所示
//Sorry for the inconvenience of shorterned code, for context see the link "here (1)"...
override this.ActivateAsync() =
this.RegisterTimer(new Func<obj, Task>(this.FlushQueue), null, TimeSpan.FromMilliseconds(100.0), …Run Code Online (Sandbox Code Playgroud)