1

我知道它们都使用不同的编程范式,但从高层次的角度来看,除了不同的语法之外,似乎大多数基本任务都可以以类似的方式完成。

我之所以这么说,是因为当我之前接触过 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# 程序来执行实际任务,并且我想知道“不同范式”障碍的真正作用在哪里?

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

4

3 回答 3

4

w 障碍出现时的主要区别在于人们必须根据功能而非对象进行思考。

是的,完全可以在 F# 中编写面向对象的代码,在这件事上,除了语法之外,这两者之间并没有太大的区别。但这不是使用 F# 的重点,即使 F# 允许您这样做。

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

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

  • 模式匹配。有时人们很难理解它的用处。
  • 尾递归(以及解决问题的“递归”方式)
  • 有区别的联合(人们仍然试图将它们视为类的层次结构、IEquatable/IComparable 实现等,而不仅仅是声明性地思考)
  • “单位”值超过“无效”。
  • 部分应用程序(由于最新版本的 C# 允许我们处理 Funcs,因此变得更容易一些,但因为它看起来很丑,所以很少有人这样做)
  • 变量值的整个概念(包括不变性)

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

于 2013-08-24T14:30:32.680 回答
2

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

从更高级但更具体的角度来看,C# 和 F# 到目前为止是不同的,因为 F# 的功能是 C# 的超集。(请不要为此而发火,严格来说,我知道这不是真的,但它给出了一张图片)

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

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

  • 函数式编程:F#“变量”,它们实际上被称为值,默认情况下是不可变的,因此 ac# 样式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# 的激励通常是功能子集,而不是面向对象的子集。

于 2013-08-24T16:44:30.993 回答
0

Looks like you haven't done too much Haskell?

How is, for example,

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

less recognzable?

If you like, you can even have an alias for for forM_

于 2013-08-24T16:40:44.897 回答