这几天来,我一直在思考Haskell中的函数式编程范例。我通过阅读教程和观看视频来做到这一点,但似乎没有什么能真正坚持下来。 现在,在学习各种命令式/面向对象语言(如C、Java、PHP)时,练习对我来说是一种很好的方式。但是因为我不知道Haskell有什么能力,而且有很多新概念可以利用,所以我不知道从哪里开始。
你是怎么学会哈斯克尔的?是什么让你真正“打破僵局”的?还有,开始练习有什么好主意吗?
这几天来,我一直在思考Haskell中的函数式编程范例。我通过阅读教程和观看视频来做到这一点,但似乎没有什么能真正坚持下来。 现在,在学习各种命令式/面向对象语言(如C、Java、PHP)时,练习对我来说是一种很好的方式。但是因为我不知道Haskell有什么能力,而且有很多新概念可以利用,所以我不知道从哪里开始。
你是怎么学会哈斯克尔的?是什么让你真正“打破僵局”的?还有,开始练习有什么好主意吗?
当前回答
这里有一本好书,你可以在线阅读:Real World Haskell
我所做的大多数Haskell程序都是用来解决Project Euler问题的。
不久前我读到的一条建议是,你应该有一套你知道如何解决(理论上)的简单问题的标准集,然后每当你试图学习一种新语言时,你就用这种语言实现这些问题。
其他回答
为了补充别人的答案——有一个有用的答案会在编码时帮助你(例如在解决项目欧拉问题时): 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页面:http://haskell.org。这里有很多材料,还有很多Haskell中最新的东西的引用,这些都是Haskell社区批准的。
这里有一本好书,你可以在线阅读:Real World Haskell
我所做的大多数Haskell程序都是用来解决Project Euler问题的。
不久前我读到的一条建议是,你应该有一套你知道如何解决(理论上)的简单问题的标准集,然后每当你试图学习一种新语言时,你就用这种语言实现这些问题。
我还可以推荐另一个Haskell教程作为介绍。
另一个很好的学习资源(可能在中级水平上),它对我帮助很大,据我所知,在其他答案中没有提到,是Brent Yorgey的Typeclassopedia,可以在Monad Reader(第13期)中找到
它以一种非常容易理解的风格编写,并包含(除许多其他内容外)以下介绍性建议:
Haskell专家的智慧有两个关键: 了解类型。 获得对每个类型类及其与其他类型类之间关系的深刻直觉 类型类,通过熟悉许多示例来支持。
Monad Reader本身对于函数式程序员(不仅仅是Haskell程序员)来说是一个绝对的宝藏。