从高级编程的角度来看,C#和F#之间的主要区别是什么?

时间:2013-08-24 12:23:57

标签: haskell f# functional-programming

我知道他们都使用不同的编程范例,但从高层次的角度来看,除了不同的语法之外,似乎最基本的任务可以以类似的方式实现。

我之所以这么说,是因为当我之前接触过像Haskell这样的函数式编程语言时,为基础任务编写代码(起初)是困难的,令人沮丧的,并且需要完全不同的思维模式。

例如,以下花了一些时间来掌握使用递归语法:

loop :: Int -> IO ()
loop n = if 0 == n then return () else loop (n-1)

F#循环几乎可以立即识别和理解:

let list1 = [ 1; 5; 100; 450; 788 ]
for i in list1 do
   printfn "%d" i

当C#程序员开始学习F#时,建议他们完全重新思考他们的思维模式(Haskell肯定是必需的),但我现在写了几个处理条件,循环,数据集等的F#程序来执行实际操作任务,我想知道“不同范式”的障碍究竟在哪里发挥作用?

希望有人能够解决我的困惑。

3 个答案:

答案 0 :(得分:4)

障碍开始时的主要区别在于人们不得不考虑功能而不是物体。

是的,完全有可能在F#中使用面向对象的代码,并且在这个问题上除了语法之外,这两者之间没有那么大的区别。但是,这不是使用F#的重点,即使F#允许你这样做。

当开发人员开始以功能性方式解决问题时,障碍就会出现。

以下是学习F#/ FP时C#/ OO开发人员的一些新主题

  • 模式匹配。有时候人们很难理解它的用处。
  • 尾递归(以及解决问题的“递归”方式)
  • 受歧视的联盟(人们仍然试图将它们视为类的层次结构,IEquatable / IComparable实现等,而不仅仅是以声明的方式思考)
  • “单位”值超过“无效”。
  • 部分应用程序(稍微容易一点,因为最新版本的C#允许我们处理Funcs,但因为它看起来很难看并不是很多)
  • 关于变量的整个价值概念(包括不变性)

C#和F#之间的主要区别在于F#为您提供了所有这些,并且有意义地接受并使用它。 但是,是的,仍然可以在F#中编写“Csharpish”代码,而不会踢任何障碍,除非在这种情况下,人们会讨厌F#的语法。

答案 1 :(得分:2)

你的问题有点误导。从非常高层次的角度来看,几乎所有的编程语言都是等价的。它们都是图灵完备的,因此,您可以解决同一组问题。

从更高层次但更具体的角度来看,C#和F#到目前为止有所不同,因为F#的功能是C#的超集。 (拜托,请不要因为这个而激怒我,我知道这不是真的,严格来说,但它给出了一张照片)

F#是一种.net语言,它继承了.net的对象模型,因此在面向对象的子集中非常类似于C#,由于更好的类型推断,语法更加轻量级。

但是,F#还支持另外两种范例:

  • 函数式编程:F#“变量”,它们实际上称为值,默认情况下是不可变的,因此ac#style int i = 0; i = i+1;在F#中看起来非常不同,因为你需要明确允许变量let mutable i = 0; i <- i + 1;。因此,如果你看一下功能子集,事实上,F#与Haskell相比要比C#更接近。

  • 命令式编程:你也可以用面向脚本的方式编写F#代码,没有类,模块等。只是一个纯脚本,在这种情况下,它看起来与C#非常不同。

您的示例使用的循环类似于编写C#代码的方式,因此感觉类似。

但是,如果你做了一个非常小的改变,你可以用与C#完全不同的方式实现同​​样的目的。 [ 1; 5; 100; 450; 788 ] |> List.iter (printfn "%d")

人们倾向于声称你需要改变你对问题的看法的原因是因为对于C#程序员来说,F#的激励通常是功能子集,而不是对象 - 导向的。

答案 2 :(得分:0)

看起来你没有做太多Haskell?

例如,

let list1 = [ 1, 5, 100, 450, 788 ]
forM_ list1 printStrLn

不太可识别?

如果您愿意,您甚至可以为for

设置别名forM_