【问题标题】:From a high level programming perspective, what is the major difference between C# and F#? [closed]从高级编程的角度来看,C# 和 F# 之间的主要区别是什么? [关闭]
【发布时间】:2013-08-27 10:21:05
【问题描述】:

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

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

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

【问题讨论】:

  • let rec loop n = if n = 0 then () else loop (n - 1)
  • “C# 能做什么而 F# 不能?NullReferenceException!” :)
  • @AlexeyRaga (null : string).Length
  • @AlexeyRaga 任何不明显的代码都使用 .NET 库和 I/O。 null 存在于 F# 中,不能简单地忽略,因为“大多数惯用 F# 的情况不使用 null”。

标签: haskell f# functional-programming


【解决方案1】:

w当障碍出现时的主要区别是人们必须根据功能而不是对象来思考。

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

当开发人员开始以实用的方式解决问题时,障碍就会出现。

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

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

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

【讨论】:

    【解决方案2】:

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

    从更高级但更具体的角度来看,C# 和 F# 迄今为止存在差异,因为 F# 的功能是 C# 的超集。 (请不要为此喷我,严格来说,我知道这不是真的,但它给出了一个图片)

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

    不过,F# 还支持另外两种范式:

    • 函数式编程:F#“变量”,它们实际上被称为值,默认情况下是不可变的,因此 ac# 样式 int i = 0; i = i+1; 在 F# 中看起来非常不同,因为您需要明确地允许可变性 @987654322 @。因此,如果您查看函数子集,F# 实际上更接近 Haskell,而不是 C#。

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

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

    但是,如果您进行非常小的更改,则可以以与 C# 完全不同的方式实现相同的目标。 [ 1; 5; 100; 450; 788 ] |> List.iter (printfn "%d")

    人们倾向于声称您需要改变思考问题的方式的原因是,对于 C# 程序员来说,F# 的激励通常是功能子集,而不是对象面向对象。

    【讨论】:

      【解决方案3】:

      看起来你没有做太多 Haskell?

      例如,怎么样

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

      不太容易辨认?

      如果你愿意,你甚至可以为forM_ 起一个别名for

      【讨论】:

      • 当你把它变成forM_ list1 $ \i -> printf "%d" i时,它会变得更加明显,尤其是在适当的缩进下。
      猜你喜欢
      • 1970-01-01
      • 2010-11-13
      • 2010-10-17
      • 2013-06-11
      • 2014-06-16
      • 1970-01-01
      • 2010-10-26
      • 2012-04-23
      相关资源
      最近更新 更多