我是一名 C# 程序员,在经历了一些关于函数式编程和声明式编程的精彩讨论之后。我觉得我两者都不擅长:P,所以,我正在考虑开始学习 prolog 和 haskell。请建议这样做的可行性。如果我学习 F#,那么学习 Haskell 是否有意义?这些语言将为我提供哪些可以帮助我编写更好的 c# 程序的品质?
8 回答
很少有语言 X,如果有的话,你不能写一个 Reg Braithwaite 批准的帖子,形式是“我从语言 X 中学到的东西,这使我在使用语言 Y 时成为更好的程序员”
C# 本身正在积累大量的函数式构造——lambda 表达式和System.Linq
扩展方法——因此学习函数式思考肯定会帮助你从日常工作语言中获得最大的收益,并从中获得乐趣。碰巧 Erlang 是我在 C# 之后学习的第一个功能/模式匹配语言,但仅此一项就足以让我重新审视我的 C# 风格以及我如何解决问题。
FP 正在成为下一件大事,并且不乏可供查看的语言并决定哪种语言最适合您学习——Haskell、Erlang 以及新来者 F#、Scala 和 Clojure 都在这股浪潮中。
就像您第一次从命令式转到面向对象时一样,使用函数式编程需要重新调整您的思考方式。第一次你倾向于以混合方式做事,直到你掌握了这一切的要点。由于您来自 C# 背景,我建议您尝试 F#,因为您可能会更快地习惯它,因为 .net 语言共享一个足以让您入门的通用框架。
也就是说,直接使用 Prolog 和 Haskell 并不是一个坏主意,但与 C# 和 F# 之间的飞跃相比,您可能必须首先适应语言的不同语法和库。就个人而言,我通过两本书从 C#/Java 转到 Haskell:RealWorldHaskell和The Craft of Functional Programming,并且管理得很好,所以你没有理由不这样做。:)
学习 F# 和 Haskell 仍然需要一些工作,因为 F# 和 Haskell 是不同的:第一个是“不纯的”,而第二个是“纯的”。杂质意味着某些“副作用”,例如状态和 IO,本质上是允许的,而纯度意味着您不会立即获得它们,而是必须使用某些方法(例如 monad)。来自 C# 可能会更容易尝试 F# 然后 Haskell 原因。
我相信(个人意见警告),如果你想成为一个更好的 C# 程序员,学习 F# 和 Haskell(或任何相关的东西)永远不会有坏处!特别是在可以与 C# 集成的 F# 的情况下。函数式编程可能会为您提供某些便利,并且知道它迟早会变得有用,尤其是因为就像其他人所说的那样,当前趋势是函数式语言程序。
从像 C# 这样的命令式语言学习函数式编程非常困难,它是一种全新的思维方式(至少对我来说,你可能会发现函数式语言更容易理解!取决于你的大脑是如何工作的;))
F# 将是一个不错的选择,因为它位于 CLR 上,这意味着您可以轻松地使用从 C# 代码编写的 F# 库。
F# 通常更适合“功能”(数学)问题。
我正在考虑用 F# 在我的 C# 代码中重写一些复杂的算法,以使它们更快更简洁。
正如艾哈迈德所说。学习以新的方式思考问题只会是有益的!
我永远不会伤害学习一门新语言。我要扼杀这句话,但要点是“如果你不知道如何写一个想法,你就不知道如何思考这个想法”。它是在自然语言的背景下,但我认为它也适用于编程语言。
看一下 prolog 和 haskell 和 tinker。它至少会在你的腰带上添加工具。
函数式和逻辑(声明式)编程是另一种编程范式,您正在从另一个角度思考。
但是这两种范式可能不会对您使用 c# 进行编码产生直接影响,但是当您考虑问题本身时,它可能是间接的
我从 prolog 开始,因为它是两者中更容易的。会给你一种新范式的感觉。然后试试 haskell 或 f#。
我推荐 f# 而不是 haskell,因为通常更容易创建与 c# 和 .net 兼容的库,因此使其更有用
我在这里看到了一个观点,最好是从一开始就开始学习 prolog。我个人不同意。函数式编程更接近于你可以用其他语言做的事情。例如,在 C++ 中,您有很多从函数式编程角度出发的方法(stl 算法、boost::bind、boost::lambda 等)。我不知道 C#,但有人告诉我它发生了同样的情况。
所以我认为从函数式语言开始会更容易。我个人知道 haskell、scheme 和 prolog,我认为如果你直接从统一、跨越搜索、规则等开始,它可能会让你大吃一惊(至少它可能会让我大吃一惊 ;-) )。再次只是一个意见......
我认为学习这两种语言都不会帮助你成为更好的 C# 程序员。我会花时间练习 C# 编程。