这几天来,我一直在思考Haskell中的函数式编程范例。我通过阅读教程和观看视频来做到这一点,但似乎没有什么能真正坚持下来。 现在,在学习各种命令式/面向对象语言(如C、Java、PHP)时,练习对我来说是一种很好的方式。但是因为我不知道Haskell有什么能力,而且有很多新概念可以利用,所以我不知道从哪里开始。

你是怎么学会哈斯克尔的?是什么让你真正“打破僵局”的?还有,开始练习有什么好主意吗?


当前回答

我很喜欢看这个用Haskell进行函数式编程的13集系列。

C9讲座:Erik Meijer博士-函数式编程基础: http://channel9.msdn.com/shows/Going+Deep/Lecture-Series-Erik-Meijer-Functional-Programming-Fundamentals-Chapter-1/

其他回答

为了补充别人的答案——有一个有用的答案会在编码时帮助你(例如在解决项目欧拉问题时): Hoogle。可以使用命令行界面,也可以使用web界面。

命令行

在你安装了Haskell平台之后,一定要在cabal上安装hoogle

Hoogle用法示例:

你有一个函数f x = 3 * x + 1,你想把它应用到(5::Int)上,然后把它应用到结果上,然后应用到那个结果上,以此类推,得到一个无限的这些值的列表。你怀疑可能已经存在一个函数来帮助你(虽然不是专门针对你的f)。

该函数的类型为(a -> a) -> a -> [a],如果它的参数为f5;如果它的参数为5f,则为-> (a -> a) -> [a](我们假设该函数适用于一般类型,而不仅仅是int型)

$ hoogle "a -> (a -> a) -> [a]"
Prelude iterate :: (a -> a) -> a -> [a]

是的,你需要的函数已经存在了,它叫做iterate。你可以通过迭代func 5来使用它!

Web界面

可以在这里找到相同示例的结果。

试着用它写一些简单的程序。

你可能可以在各种教科书中找到一些示例任务。

我不建议坚持Haskell/FP教科书,只是尝试用它做一些简单的事情:计算,字符串操作,文件访问。

在我解决了一打之后,我打破了僵局:)

在此之后,阅读大量高级概念(单子,箭头,IO,递归数据结构),因为haskell是无限的,而且它们有很多。

这里有一本好书,你可以在线阅读:Real World Haskell

我所做的大多数Haskell程序都是用来解决Project Euler问题的。

不久前我读到的一条建议是,你应该有一套你知道如何解决(理论上)的简单问题的标准集,然后每当你试图学习一种新语言时,你就用这种语言实现这些问题。

如果您只有命令式/OO语言的经验,我建议使用更传统的函数式语言作为垫脚石。Haskell是非常不同的,你必须理解很多不同的概念。我建议先使用ml风格的语言(比如f#)。

我建议加入#haskell irc频道并在那里提问。我就是这样学会哈斯克尔的。如果你像上面建议的那样使用Real World Haskell,实时回答你的问题会有很大帮助。许多聪明的人在#haskell上写haskell是为了好玩和盈利,所以你会得到很多好的输入。试一试!