对于.NET和强制性OO,是否有一个不那么冗长(如在F#中)替代C#?

Jac*_*ter 2 c# f#

我只是喜欢F#来完成适合函数式编程的任务.我使用C#作为命令式OO.

但是,每当切换到C#时,留下F#的非详细语法和类型推断变得越来越痛苦.

有没有人知道是否有一些东西用于非冗长的命令式编程,因为语法和类型推断并不真正与命令式和功能性相关.

Tom*_*cek 7

F#3.0正在获得一些功能,以更好地支持命令式面向对象编程(在使用命令式.NET库进行数据访问时经常需要这些编程).它将具有自动实现的属性(请参阅MSDN文档):

type MyClass() =
    let random  = new System.Random()
    member val AutoProperty = random.Next() with get, set
    member this.ExplicitProperty = random.Next()
Run Code Online (Sandbox Code Playgroud)

它还允许您使用member let构造计算初始值(与member每次调用时重新评估主体的情况相反).

F#3.0不会使命令式编程变得更容易,当涉及到变异和类似breakcontinue循环的事情.我认为强调不可变状态是为了鼓励良好的F#编程风格,但是对此有很多讨论,你可以建议并投票支持.

还有一个关于你的评论的注释,其中"纯函数式编程是一个不匹配的".我认为这实际上取决于可用的库和您正在关注的心智模型.我相信FP实际上非常适合GUI,没有F#库可以证明它.您可能会发现这个问题很有趣:功能GUI编程是否可行?


Cod*_*aos 6

.net上有一些小众语言可能具有您想要的属性.

特别是Boo和Cobra.它们是支持使用类似python语法的隐式静态类型的语言.Boo似乎更受欢迎,但我不喜欢他们的一些设计选择.另一方面,眼镜蛇看起来很漂亮.

由于受欢迎程度低,IDE支持非常弱,特别是对于Cobra而言.


另一方面,IronPython和IronRuby仅支持动态类型.这降低了编译时的安全性,并使静态分析(对Intellisense或重构很有用)变得更加困难.


Dan*_*iel 6

我不清楚你对F#的不满意.虽然它有利于函数式编程风格,但它在很多方面也改进了.NET中的命令式编程.我想不出任何C#代码不能被功能相同 - 而且更短 - F#代码所取代(不安全的代码是我想到的唯一例外).

甚至是表示例如数据库记录的可变类型

class Employee {
    public Employee(string firstName, string lastName, int age) {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Age = age;
    }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

可以在F#中简化为以下内容:

type Employee =
  { mutable FirstName : string
    mutable LastName : string
    mutable Age : int }
Run Code Online (Sandbox Code Playgroud)

这应该是C#的一杯茶.

当你遇到F#缺乏的功能时,它通常表明有更好的方法.现在是停止和分析典型命令式方法缺点的好时机.

事实上,F#的最大优势可能在于它是一种多范式的语言.您可以使用OO来构建项目,并使用"小型"功能编程来组织模块 - 没有一种风格可以占主导地位.它只会增加工具箱的大小.

如果有特定的任务/概念,您在移植到F#时遇到问题,您应该提及它们,以便其他人可以提供解决方案.