作为一名C#程序员,需要学习Prolog和Haskell吗?

6

我是一名C#程序员,经过一些关于函数式编程和声明式编程的精彩讨论后,我感觉自己两种都不擅长:P,因此,我想开始学习Prolog和Haskell。请建议这样做的可行性。如果我学习F#,那么学习Haskell有意义吗?这些语言将为我提供哪些质量,可以帮助我编写更好的C#程序?

8个回答

7

如果你想写一篇得到 Reg Braithwaite 认可的文章 "我在使用语言 Y 时从语言 X 学到的让我成为更好的程序员", 那么很少有语言 X 是不行的,甚至没有。

C# 本身正在积累一些函数式构造 - lambda 表达式和 System.Linq 扩展方法 - 因此学会思考函数式编程绝对有助于发挥最佳日常工作语言的效果,同时也是一种有趣的体验。碰巧的是,在 C# 之后,Erlang 是我接触的第一种函数式/模式匹配语言,但仅此一项就足以让我重新审视我的 C# 编码风格和解决问题的方式。

函数式编程正成为下一个大趋势,有很多语言可以看看并决定哪种最适合学习 - Haskell、Erlang,还有新手 F#、Scala 和 Clojure 都在搭这股浪潮。


7
  1. 像第一次从命令式编程转向面向对象编程一样,学习函数式编程需要重新调整思维方式。在初学阶段,你可能会采用混合编程的方式,直到理解了全部内容为止。由于你有 C# 的背景,我建议你尝试学习 F#,因为 .net 语言共享一个通用框架,这足以让你快速上手。
  2. 不过,直接学习 Prolog 和 Haskell 也不是坏主意,但是与从 C# 到 F# 的跨度相比,你可能需要先适应不同的语法和库。个人经验是,我通过阅读两本书从 C#/Java 转向了 Haskell:RealWorldHaskellThe Craft of Functional Programming,并且进展顺利,所以你也完全可以做到。 :)
  3. 学习 F# 然后再学习 Haskell 仍然需要一些工作,因为 F# 和 Haskell 是不同的:前者是“非纯”的,而后者是“纯”的。非纯意味着某些“副作用”(例如状态和 IO)是内在允许的,而纯度意味着你不能立即得到它们,但必须使用某些方法(如单子)。由于你有 C# 的背景,因此尝试先学习 F# 再学习 Haskell 或许更容易。
  4. 我认为(个人观点警告),如果你想成为更好的 C# 程序员,学习 F# 和 Haskell(或其他任何语言)绝不会有坏处!特别是对于可以与 C# 集成的 F#。函数式编程可能会为你提供某些便利,而了解它可能在以后变得有用,特别是因为像其他人说的那样,目前似乎存在一种向函数式语言的趋势。

4
从像C#这样的命令式语言转向学习函数式编程非常困难,因为这是一种全新的思维方式(至少对我来说是这样,你可能会发现函数式语言更容易理解!这取决于你的大脑如何工作 ;))
F#是一个很好的选择,因为它位于CLR上,这意味着您可以轻松地从C#代码中使用您编写的F#库。
F#通常更适合“函数式”(数学)问题。
我正在考虑使用F#重写我的C#代码中的一些复杂算法,使它们更快,更简洁。
正如Ahmed所提到的,学习以一种新的方式思考问题只会有益处!

3

学习一门新语言永远不会有害。我可能会误引用这句话,但其核心意思是:“如果你不知道如何书写一个思想,你就不知道如何思考这个思想”。虽然该语句是针对自然语言的,但我认为它也适用于编程语言。

看看Prolog、Haskell,并进行一些尝试。至少,这将增加你的工具库。


2

函数式编程和逻辑(声明式)编程是另一种编程范式,你需要从另一个角度思考问题。

但是这两种范式可能不会直接影响你使用C#进行编码,但在思考问题本身时可能会产生间接影响。


2

我建议您从Prolog开始学习,因为它是两者中更容易的一种。这将让您对一种新的编程范式有所了解。然后尝试学习Haskell或F#。

我建议您选择F#而不是Haskell,因为F#更容易创建与C#和.NET兼容的库,因此更加实用。


2
我看到这里有一个观点认为最好一开始学习Prolog。我个人不同意。函数式编程更接近其他语言的操作方式。例如,在C++中,您可以从函数式编程角度采用很多方法(STL算法、boost::bind、boost::lambda等)。我不了解C#,但我被告知它也是如此。
因此,我认为从函数式编程语言入手会更容易。我个人了解Haskell、Scheme和Prolog,如果您直接使用统一、跨度搜索、规则等功能,可能会让您的头脑有些混乱(至少我的头脑会这样)。这只是我的个人看法...

我在尝试编写我的第一个Hello World Prolog程序的过程中在Google上进行了搜索,但徒劳无功。我已经下载了SWI-PROLOG,但是我无法猜测如何编写文件并运行(consult)它。 - pokrate

-5

我认为学习这两种语言都不会让你成为更好的C#程序员。我建议你把时间花在练习C#编程上。


5
将自己锁在黑暗的房间里,不与任何人说话或学习新东西也许是一种......哦等等,那是不好的,不好! - Andrew Bullock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接