7

我承认我还没有深入了解 F#。但是在 30,000 英尺的描述中,他们一直在谈论易于测试且没有可变状态的代码。这和静态方法一样吗?

我可以通过在具有所有静态方法的类中编写一些代码来获得 F# 的好处吗?

我只是在寻找简短的答案,我知道有关该主题的整本书都存在。

4

7 回答 7

8

绝对不,不变性与静态或实例方法无关。String作为一个不可变的类,它有很多实例方法,它们以一种非常实用的方式返回一个新的String类实例,而不是修改任何东西。

您可以尝试使用功能分解来模拟 F#,但这仍然是非常命令式的代码。

于 2009-04-28T12:38:15.790 回答
8

您当然可以不可变地编写 C# 代码,但这与静态函数无关。不变性是诸如拥有一个结构或对象之类的东西,这些结构或对象只能通过制作自身的副本并让副本不同来“改变状态”。

于 2009-04-28T12:40:12.667 回答
5

除了静态、功能模块与对象之外,您还可以尝试通过使用 C# 3 和 lambdas、LINQ 等来获得 F# 的一些好处。但是,这并没有走得太远。我觉得 F# 的优点是:

  • 无处不在的推理
  • 自动泛化(添加类型参数,所以我不必手动整理)
  • 简单的不变性
  • 模块和类之间的轻松混合
  • 歧视工会等类型
  • 模式匹配
  • 嵌套函数(轻量级)
  • 一流的函数(不,C# 的命名委托不算在内)
  • 一切都是一种表达
  • 简单的功能组合

因此,您可以尝试在 C# 中执行其中的一些操作。其中一些根本不受支持并且无法正常工作。其余的变得非常丑陋,非常快。

因此,如果您远离 LINQ 和 Enumerable 扩展的老路,您可能最终会陷入痛苦的世界。

于 2009-04-29T04:02:40.640 回答
4

我希望与迄今为止的所有其他答案有所不同。不变性和静态方法在技术上可能并不严格相关,但我发现使用 F# 鼓励我尽可能将 C# 方法设为静态。

这种想法是类比的,因为处理不可变对象更容易,因为您不必担心它会改变状态。同样,使用静态方法时您不必担心状态(除非您使用全局单例或其他东西......)。

于 2009-04-29T07:26:52.770 回答
3

不,它与静态方法不同。如果在初始化后不分配任何内容(局部变量、函数参数、静态字段、实例字段),则您没有可变状态。您可以通过将类设计为不可变来获得一些好处。

于 2009-04-28T12:37:38.740 回答
2

不,这两个概念无关。C# 中的静态方法仍然可以正常修改传入的对象,并使用 ref 或 out 修改其他变量。

于 2009-04-28T12:38:27.757 回答
1

这是真的。仅仅通过在 C# 中使用更多的静态函数是无法获得函数式编程的好处的。但是,如果您要深入了解(例如使用 Reflector),我理解一个简单的 let 语句是一个静态函数。换句话说,

//F#
let a = 2

就像 C# 中的函数

//C#
static int a()
{
    return 2;
}

我能理解这种困惑。

解释来自 Leon Bambrick 的“F# Eye for the C# Guy 演示文稿”。

于 2009-07-07T17:58:03.307 回答