标签: c#-to-f#

C#默认关键字的F#中的等价物是什么?

我正在寻找相当于C#的default关键字,例如:

public T GetNext()
{
    T temp = default(T);
            ...
Run Code Online (Sandbox Code Playgroud)

谢谢

c# f# default keyword c#-to-f#

72
推荐指数
2
解决办法
8835
查看次数

F#相当于C#typeof(IEnumerable <>)

我有一段代码,我需要弄清楚一个给定的类型是否实现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<>.

任何人都知道解决方案,顺便也可以对上面的代码发表评论.

reflection f# c#-to-f#

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

C#和F#cast - 特别是'as'关键字

在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)

它是否正确?

c# f# c#-to-f#

27
推荐指数
3
解决办法
6201
查看次数

抽象声明中没有参数名称?

这是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#)吗?

f# c#-to-f#

26
推荐指数
2
解决办法
1289
查看次数

方法链接vs |>管道操作员

所以我有以下代码:

// 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的语法高亮显示也突出了错误(不相关)的事情.无论是那个还是我都不习惯它.

f# map filter method-chaining c#-to-f#

23
推荐指数
3
解决办法
6957
查看次数

F#中的全局常量 - 如何

我需要通过几个相关项目设置要在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#中的等价结构是什么.我试图提出一个可以作为属性参数接受的绑定的尝试都没有用.

f# constants c#-to-f#

21
推荐指数
2
解决办法
5434
查看次数

如何在Visual Studio中组织大型项目的F#源(> 300个类)?

在C#中,您可以将文件放在与其命名空间相对应的文件夹中,并在解决方案资源管理器中查看它们.

在F#中,似乎我必须将所有内容放在简单有序的列表中进行编译.当我达到~300级的规模时,它会让人感到有些困惑和混乱,我开始羡慕C#,并认为它可能是类型推断的代价.

有没有比拆分成几个组件更好的选择?

由F#编译器的源来看它的路线,他们已经采取,但我有互联组件(控制器视图,> 300类 - - 视图模型)的相当大的系统,我想是因为在循环依赖的一个组件,即使在接口水平.

我应该忘记一个文件 - 一个类并创建一些巨大的文件?(例如,在F#编译器中,您有几个100kb到300kb范围内的源文件,并且有些自动生成1Mb左右!)

您对大型F#项目的体验是什么?

f# assemblies code-organization visual-studio c#-to-f#

21
推荐指数
2
解决办法
3161
查看次数

F#中的简单类型测试

我已经谷歌搜索了一段时间......好吧,对不起,这个很简单,但是F#中有一个运算符来比较类类型,比如C#中的'is'关键字?我不想使用完整的匹配声明或开始铸造东西.干杯

f# c#-to-f#

17
推荐指数
2
解决办法
3279
查看次数

F#从C#中区分联盟使用

使用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# c#-to-f#

16
推荐指数
2
解决办法
4484
查看次数

将异步 - 等待C#代码转换为与调度程序相关的F#

我想知道这是否是一个太广泛的问题,但最近我让自己遇到了一段我想确定如何从C#转换为适当的F#的代码.旅程从这里开始(1)(TPL-F#交互的原始问题),并继续这里(2)(我正在考虑转换为F#的一些示例代码).

示例代码在这里重现的时间太长,但有趣的功能是ActivateAsync,RefreshHubsAddHub.特别有趣的是

  1. AddHub有签名private async Task AddHub(string address).
  2. RefreshHubsAddHub在循环中调用并收集一个列表tasks,然后它在最后等待await Task.WhenAll(tasks),因此返回值与其签名匹配private async Task RefreshHubs(object _).
  3. 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)

c# f# task-parallel-library c#-to-f# orleans

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