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

时间:2012-02-17 10:38:18

标签: c# f#

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

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

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

4 个答案:

答案 0 :(得分:7)

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

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

它还允许您使用member let构造计算初始值(与仅member相反,每次调用时都会重新评估正文)。

当涉及到突变以及循环中的breakcontinue之类的事情时,F#3.0不会使命令式编程变得更容易。我认为强调不可变状态是为了鼓励良好的F#编程风格,但对此有很多讨论,你可以suggest & vote for this

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

答案 1 :(得分:6)

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

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

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


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

答案 2 :(得分: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; }
}

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

type Employee =
  { mutable FirstName : string
    mutable LastName : string
    mutable Age : int }

那应该是C#的一杯茶。

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

事实上,F#的最大优势可能在于它是一种多范式的语言。您可以使用OO来构建项目,使用函数式编程"in the small"来组织模块 - 没有一种风格可以支配。它只会增加工具箱的大小。

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

答案 3 :(得分:0)

我还会说你似乎混淆了命令式和OO的概念 - 它们不是一回事。 C是一种命令式语言,但肯定不是OO。从this question引用的文章中可以看出,Kay博士确实认为Smalltalk是一种功能语言,Smalltalk是大多数OO概念的先驱。语言的命令性“属性”与其面向对象的属性正交。因此,如果你真的在问F#是否会更好地支持OO,那么我认为Tomas已经很好地回答了你的问题。我所说的只是在考虑命令式编码和OO编码时要小心 - 它们不是一回事。