我承认我还没有深入了解 F#。但是在 30,000 英尺的描述中,他们一直在谈论易于测试且没有可变状态的代码。这和静态方法一样吗?
我可以通过在具有所有静态方法的类中编写一些代码来获得 F# 的好处吗?
我只是在寻找简短的答案,我知道有关该主题的整本书都存在。
我承认我还没有深入了解 F#。但是在 30,000 英尺的描述中,他们一直在谈论易于测试且没有可变状态的代码。这和静态方法一样吗?
我可以通过在具有所有静态方法的类中编写一些代码来获得 F# 的好处吗?
我只是在寻找简短的答案,我知道有关该主题的整本书都存在。
绝对不,不变性与静态或实例方法无关。String
作为一个不可变的类,它有很多实例方法,它们以一种非常实用的方式返回一个新的String
类实例,而不是修改任何东西。
您可以尝试使用功能分解来模拟 F#,但这仍然是非常命令式的代码。
您当然可以不可变地编写 C# 代码,但这与静态函数无关。不变性是诸如拥有一个结构或对象之类的东西,这些结构或对象只能通过制作自身的副本并让副本不同来“改变状态”。
除了静态、功能模块与对象之外,您还可以尝试通过使用 C# 3 和 lambdas、LINQ 等来获得 F# 的一些好处。但是,这并没有走得太远。我觉得 F# 的优点是:
因此,您可以尝试在 C# 中执行其中的一些操作。其中一些根本不受支持并且无法正常工作。其余的变得非常丑陋,非常快。
因此,如果您远离 LINQ 和 Enumerable 扩展的老路,您可能最终会陷入痛苦的世界。
我希望与迄今为止的所有其他答案有所不同。不变性和静态方法在技术上可能并不严格相关,但我发现使用 F# 鼓励我尽可能将 C# 方法设为静态。
这种想法是类比的,因为处理不可变对象更容易,因为您不必担心它会改变状态。同样,使用静态方法时您不必担心状态(除非您使用全局单例或其他东西......)。
不,它与静态方法不同。如果在初始化后不分配任何内容(局部变量、函数参数、静态字段、实例字段),则您没有可变状态。您可以通过将类设计为不可变来获得一些好处。
不,这两个概念无关。C# 中的静态方法仍然可以正常修改传入的对象,并使用 ref 或 out 修改其他变量。
这是真的。仅仅通过在 C# 中使用更多的静态函数是无法获得函数式编程的好处的。但是,如果您要深入了解(例如使用 Reflector),我理解一个简单的 let 语句是一个静态函数。换句话说,
//F#
let a = 2
就像 C# 中的函数
//C#
static int a()
{
return 2;
}
我能理解这种困惑。
解释来自 Leon Bambrick 的“F# Eye for the C# Guy 演示文稿”。