用于学习惯用的Haskell(eta约简,符号中缀运算符,库等)的资源

时间:2011-11-18 21:30:18

标签: haskell idioms

尽管有一些Lisp和ML的经验,但我在学习阅读和(惯用)编写Haskell方面遇到了很多麻烦,因为本地风格似乎是

  • 尽可能消除
  • 使用括号来支持利用运算符优先级
  • 将一半的逻辑打包到超载的非字母数字中缀运算符桶中

最后一个特别困难,因为有很多预定义的运算符,每个运算符都有自己的约定和一般语义,通常读取Haskell会成为Hoogle和:type中的练习。

是否有任何好的教程假设CS /功能概念的知识,而是专注于Haskell特定的习语?我正在寻找类似Real-World Haskell的东西,它以一个非常幼稚,明确的程序开始,然后逐渐将其转换为更惯用的风格,介绍和解释成语。但是它不是引入和解释像monad和类类这样的一般概念,而是引入特定的monad和特定的类型类,比如“但这正是Alternative monoid所做的!”

2 个答案:

答案 0 :(得分:24)

通过阅读Hoogle和/或Haskell-2010 Language Report找到的图书馆文档,可以很容易地掌握基本类型类,例如ShowEqOrd

Haskell中的数字塔似乎是复杂的(Int类型是根据报告的11种类型的实例),但它只是支持数学家为数学家发明的所有有用的数字和数字表示。我们:例如Integer是任意大小的整数,Int是通常的机器字大小的整数,并且整数的懒惰Peano表示(不在标准库中)证明在图算法的实现中是有用的。最重要的数字类型类是NumIntegral。您可以使用fromIntegral函数在不同的整数类型之间进行转换。还要注意123之类的数字具有类型Num a => a,并且有一种特殊类型的默认机制,旨在减少类型声明的需要,以指定所需的精确数字类型。在高级用例中,这对您不利,因此您可能希望更改默认值。

同样的情况是不同类型的字符串:没有单一的表示适合所有字符串,因此很多字符串在野外:StringData.ByteStringData.Text是最重要的。< / p>

关于更复杂的类型类,最好的来源是Typeclassopedia

对于某些类型类,例如MonadApplicativeArrow,有许多专门的教程和研究工作。根据您的数学技能,您可能还想阅读关于类型类背后的类别理论概念的原始研究论文,例如Eugenio Moggi的优秀“计算和monad”概念。

至于“eta减少”,它被称为Point-Free Style。你可以从中获得一些信息 该链接提到的参考文献。您还可以查看由John Backus Can programming be liberated from von neumann style?和APL编程语言撰写的1978年论文Combinatory Logic,以获得关于无点样式的更丰富的历史视角。

还有一些关于Haskell的通用书籍,例如“对Haskell的温和介绍”和“为了大好的方法了解你的Haskell”。

至于运算符优先级 - 你必须记住的运算符很少:(.)($)(>>=)比其他任何东西都使用得更多(当然除了算术运算符,但算术运算符是相当不足为奇。)

元组和列表的语法对我来说似乎也没有问题。这只是多余的:foo : bar : [][foo, bar]相同,(,) foo bar(foo, bar)相同。 <{1}}等高级元组的前缀版本很少使用。

另请参阅http://www.haskell.org/haskellwiki/Section_of_an_infix_operator,了解(,,,,)(+ 2)被称为部分等结构的说明。

此外,您还可以了解HLint工具建议的更改,以改进您的代码。 HLint可执行文件可以由(2 +)安装。

至于高级主题,我可以推荐研究纯粹的功能数据结构(让你设计有效的不可变数据结构和时间消耗的原因),需要lambda演算调用(让你推断评估的内容和顺序),系统Fc类型系统(给你一些关于haskell类型检查器如何工作的背景),指称语义(关于非终止,偏倚和递归的推理,以及对严格性,纯度和可组合性概念的一些见解)。

答案 1 :(得分:6)

我认为"Write Yourself a Scheme in 48 Hours"教程正是您所需要的。本教程解释了如何在Haskell中实现Scheme解释器;这是一个真正让一切都为我点击的文件。

它有各种Haskell习语和想法的具体例子,所有这些都在一个很酷的项目中汇集在一起​​。这对于有Lisp经验的人来说特别好,特别是如果你读过类似SICP的东西或之前已经实现过Scheme解释器。无论哪种方式,本教程都很棒,但如果您以前做过类似的事情,可能会更容易理解。