Post

重拾 Haskell

Long long ago and far far away, the first time I saw Haskell, I fell in love with it.

为什么呢?

因为我看到了以下两小行代码。

List Comprehension:

1
rightTriangles = [ (a,b,c) | c <- [1..20], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2] 

Quicksort:

1
2
3
4
5
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
    where
        lesser = filter (< p) xs
        greater = filter (>= p) xs

前者与数学中常见的集合写法一模一样,后者则比一般的伪代码还要简洁易懂 (虽然这并非真正的快排1,但用于学习算法却十分合适)。我感到了 Haskell 的优美与表达力。

稍微学习后 Haskell 强大的抽象能力令我印象深刻,尤其是学会写简单的 Parser Combinator 时。再后来我碰巧看了些 SICP 学了点Lisp。 除了没有 宏 Marco (也不可能有) 以外,在我感兴趣的范围内 (以 AI 为主的 大型工程 或 工业界应用,不了解也不评价),写代码的简洁程度,易维护性 Haskell 都远胜 Lisp。在经验与技巧的支撑下,Haskell 的性能在流行的编程语言中也名列前茅。

但说道底只是学着玩,有其他更重要的事做,或者学习过程中啃到硬骨头,自然就停了下来,挺多年没写过了。

在那时我大概学了这些内容:

  • 读了一些书
  • Codewars 当作玩解谜游戏一样刷了很多 Haskell kata
    • natural number 的各种玩法
    • 一些 combinator (比如 SKI)
    • 各种 type hole 完形填空
  • 了解 PL/编译器 相关的一些基础
    • 生成解析 Abstract Syntax Tree,跟着教程搓了一个毫无优化,功能阉割的 lisp
    • 控制 lazinesss
    • Continuation-Passing Style
    • Calculating Correct Compilers
  • 看了些 blogs/tutorials
  • 使用了一些 Haskell 写的软件
    • pandoc
    • hakyll (静态站点生成器)
  • 甚至学了点 agda

由于时间过于久远,做了一些复健。很快把 Learn You a Haskell 扫了一遍,接着写了 Ninety-Nine Haskell Problems 练练手。

之后打算先看看 What I Wish I Knew When Learning Haskell。然后学一下 lens,了解它的原理,看看它如何在大型项目中使用,最好自己也用一用。

前段时间,在这个介绍 PNG 格式图像压缩的视频里,了解到了 QOI 这个简单高效仅问世 1 年的图片格式,挺有趣的,打算拿 Haskell 写一个试试,虽然有人已经做过这事了(


  1. https://stackoverflow.com/questions/7717691/why-is-the-minimalist-example-haskell-quicksort-not-a-true-quicksort 

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.