尽管有一些Lisp和ML的经验,但我在学习阅读和(惯用)编写Haskell时遇到了很多麻烦,因为本地风格似乎是
最后一个特别困难,因为有很多预定义的运算符,每个运算符都有自己的约定和一般语义,经常阅读Haskell成为Hoogle和:type.
是否有任何好的教程假设CS /功能概念的知识,而是专注于Haskell特定的习语?我正在寻找类似Real-World Haskell的东西,它以一个非常幼稚,明确的程序开始,然后逐渐将其转换为更惯用的风格,介绍和解释成语.但是它不是引入和解释像monad和类类这样的一般概念,而是引入特定的monad和特定的类型类,比如"但这正是Alternative monoid所做的!"
npo*_*cop 24
基本型类,如Show,Eq和Ord应该很容易通过阅读Hoogle和/或发现库文档把握哈斯克尔-2010语言报告.
Haskell中数字塔似乎被卷积(Int类型为哮根据报告11个型类的实例),但它仅仅是支持所有有用的各种数字和多次交涉发明了我们的数学家:例如Integer是一个任意大小的整数,Int通常的机器字大小的整数,并且整数的懒惰Peano表示(不在标准库中)证明在图算法的实现中是有用的.最重要的数字类型是Num和Integral.您可以使用fromIntegral函数在不同的整数类型之间进行转换.还要注意123这样的数字有类型,Num a => a并且有特殊类型的默认机制,旨在减少类型声明的需要,以指定所需的精确数字类型.在高级用例中,这对您不利,因此您可能希望更改默认值.
同样的情况是不同类型的字符串:没有单一的表示适合所有,其中许多是在野外:String,Data.ByteString并且Data.Text是最重要的.
关于更复杂的类型类,最好的来源是Typeclassopedia.
对于某些类型的类,如Monad,Applicative并Arrow有很多专门的教程和研究工作.根据您的数学技能,您可能还想阅读关于类型类背后的类别理论概念的原始研究论文,例如Eugenio Moggi的优秀"计算和monad"概念.
至于"eta减少",它被称为无点风格.您可以从该链接中提到的参考资料中获取一些信息.您还可以查看Combinatory Logic,一篇1978年由约翰巴克斯撰写的论文,编程可以从冯·诺曼风格中解放出来吗?和APL编程语言在无点风格上获得更丰富的历史视角.
还有一些关于Haskell的通用书籍,例如"Haskell的温和介绍"和"为了好大学而学习你的Haskell".
至于运算符优先级-真的有少数运营商必须记住:(.),($)并(>>=)使用比一切更其他(除非当然算术,但算术运算符是相当令人吃惊).
元组和列表的语法对我来说似乎也没有问题.它只是多余的:foo : bar : []与...相同[foo, bar]并且(,) foo bar相同(foo, bar).较高arity的元组的前缀版本(,,,,)很少使用.
另请参阅http://www.haskell.org/haskellwiki/Section_of_an_infix_operator以获取诸如(+ 2)和(2 +)被调用部分之类的结构的说明.
您还可以从HLint工具建议的更改中学习如何改进代码.可以通过安装HLint可执行文件cabal install HLint.
至于高级主题,我可以推荐研究纯功能数据结构(让你设计有效的不可变数据结构和时间消耗的原因),需要lambda演算调用(让你推理评估的内容和顺序),System Fc类型系统(提供了关于如何Haskell的类型检查工作的一些背景知识)(约未结束,偏袒和递归,还严格,纯度和组合性的概念,一些有识之士推理),指称语义.
我认为"在48小时内自己编写一个方案"教程正是您所需要的.本教程解释了如何在Haskell中实现Scheme解释器; 这是一个真正让一切都为我点击的文件.
它具有各种Haskell习语和想法的具体例子,所有这些都在一个很酷的项目中汇集在一起.这对于有Lisp经验的人来说特别好,特别是如果你读过类似SICP的东西或之前已经实现过Scheme解释器.无论哪种方式,本教程都很棒,但如果您以前做过类似的事情,可能会更容易理解.
| 归档时间: |
|
| 查看次数: |
3033 次 |
| 最近记录: |