Haskell中最重要的抽象是什么?Monad?Applicative?

20

我想知道哪些库、函数和概念是必须掌握的,以及如何使用它们。Monad和相关的函数是典型示例,但在编码中还有其他好的原语可用,例如Arrows、Applicative等等。他们是谁?

顺便说一下,我想了解Haskell世界的最新动态,学习新概念,应该怎么做?

(原标题为:“编码的库原语”,但已更改)


11
万一你还没有阅读过Typeclassopedia,请务必阅读。 - dave4420
这个问题的答案似乎是“尽可能多地学习”。这里提供了许多可以深入研究的主题。 - telephone
当我写这个问题时,Typeclassopedia正是我想要的。但是无法“接受”那个答案(因此没有被接受的答案)。 - telephone
3个回答

18

开始学习 Haskell 的最佳方法是安装 Haskell 平台,其中包含我们认为很重要的许多库。

如果您查看基本系统中提供的抽象内容,则会发现一些值得学习的东西:

  • ST Monad:该模块提供了可变的状态线程,您可以使用它来编写高效的、不可变的代码。
  • 同时不要忘记这些强大的工具:


    这些库几乎包含在每个Haskell发行版中。问题不是关于如何开始Haskell编程,而是定义Haskell程序员的“工具箱”。 - telephone
    Haskell平台是标准工具包,我的意思是,请看看已选择了什么。上面列出了一些最重要的事情。 - Don Stewart
    好的。这个问题的想法来自于我查看“标准库”中的模块时发现了一些有趣的概念,特别是“Arrow”。关于这些概念的文本往往在博客和Haskell WikiBook上,因此我想要一个这样的概述。 - telephone
    2
    一些你可能会用到的好资源:学习 Haskell 的最佳指南!,以及更高级的 函数式编程模式 - Don Stewart

    16

    需要了解的基本库:

    常用数据中心库:

    你需要了解的打包概念:

    • 单子,单子变换器(参见base,mtl)
    • 应用程序(参见base)
    • 箭头(参见base)
    • 软件事务性内存(stm
    • 可扩展异常(in base自GHC 6.8以来)
    • Haskell中的动态编程(请参阅base中的Data.Typeable)
    • Sparking(通过parallel进行轻量级并行处理提示)
    • 并发(请参阅base中的Control.Concurrent)
    • 记忆化(monad-memoMemoTrie

    半高级概念:

    测试、基准测试和基础设施:

    外部工具、GHC 帮助程序、GHC

    • threadscope(线程分析工具)
    • alex(词法分析器生成器)
    • happy(解析器生成器)
    • haddock(文档生成系统)
    • Haskell程序覆盖率(HPC
    • GHC手册,包括有关以下内容的信息:
      • 不同的后端
      • 分析性能
      • 调试
      • 优化
      • 语言扩展

    基于类型的知识:

    • GADTs(广义代数数据类型)
    • Rank-N Types(级别多态)
    • 存在类型
    • 功能依赖和类型族
    • 这个列表可以继续下去,但如果您掌握了以上内容,则会知道在哪里查找。

    如何保持对Haskell的最新了解,而不必提问stackoverflow:

    • 阅读ICFPPOPL所接受的论文
    • 阅读被ICFP和POPL拒绝的论文(如果你能找到的话)
    • 加入社交网络,Haskeller们似乎很喜欢:
      • Twitter(从关注Galois或任何你认识的随机Haskeller开始)
      • Reddit
      • Stack Overflow(如果需要链接,请给我发信息)
    • 阅读博客(从reddit或planet.haskell.org链接)
    • 关注haskell-cafe邮件列表或IRC上的对话。
    • 参加Galois半周技术讲座

    对于我们不在波特兰的人来说,似乎Galios在http://vimeo.com/channels/galois上发布技术讲座-我一定会查看这个。感谢,Galios! - Dan Burton

    14

    我之前曾经根据Haskell相关的实际重要性草拟了一份列表 / 分组; 如下:

    Haskell 基础 (任何情况下都是必要的)

    • 函数
    • 部分应用, 柯里化
    • 递归
    • 高阶函数
    • 代数数据类型
    • 模式匹配
    • 类型类
    • Kinds
    • Functors
    • IO monad

    实用必备 (即使你偶尔不使用这些东西,但在进行严肃工作时,你可能需要了解这些)

    • Monads
    • Monad Transformers
    • The FFI
    • Laziness/Strictness、BangPatterns等等
    • GADTs
    • TypeFamilies
    • FunctionalDependencies

    不是必须必要的,但可能有用

    • Applicative
    • Higher-Rank Polymorphism
    • OverlappingInstances
    • Lenses及其它记录系统(fcLabels等)
    • Iteratees
    • Concurrent Haskell(forkIO, MVars等)
    • Software Transactional Memory
    • TemplateHaskell
    • RULES

    课外活动(潜在的迷人之处但完全不必要)

    • Arrows
    • Functional Reactive Programming
    • Comonads、类别、态射等其它抽象无意义

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