我知道他们都使用不同的编程范例,但从高层次的角度来看,除了不同的语法之外,似乎最基本的任务可以以类似的方式实现。
我之所以这么说,是因为当我之前接触过像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#程序来执行实际操作任务,我想知道“不同范式”的障碍究竟在哪里发挥作用?
希望有人能够解决我的困惑。
答案 0 :(得分:4)
是的,完全有可能在F#中使用面向对象的代码,并且在这个问题上除了语法之外,这两者之间没有那么大的区别。但是,这不是使用F#的重点,即使F#允许你这样做。
当开发人员开始以功能性方式解决问题时,障碍就会出现。
以下是学习F#/ FP时C#/ OO开发人员的一些新主题
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_