Learn You a Haskell for Great Good!
racket
我的回答是haskell: 1. 用类似数学的方法书写程序: f x = 2 * x - 1 2. 递归 不管是函数递归还是递归的类型(这样说没错吧)表达起来极为方便: 链表的定义: data Linklist a = Node a (Linklist a) 树的定义: data Tree a = Node a (Tree a) (Tree a) 没有更简便的了吧 这也算简短代码的部分了吧。 3. 函数组合 通过函数组合将简单的函数组合为更复杂的函数而无需重写 foo = unwords . (map toUpper) . words . reverse 使用了函数科里化 运行起来大概是这样: ghci > foo "i have a dream" MAERD A EVAH I 4. 泛型 可以使用类型变量(如a)代替一类的类型 head :: [a] -> Maybe a head [] = Nothing head x:xs = Maybe x 这样就不必一个类型一个对应的取头元素的函数了 5. 类型类 类型类很好用,比如我希望一种类型可以进行相等性运算可以这样: data Foo a = Foo a --new defined type instance Eq (Foo al) where Foo a == Foo b = a == b 6. 模式匹配 这个绝对是省代码量的利器好吗~ lucky :: Int -> String lucky 7 = "You're lucky" lucky x = "Unlucky" 如果模式多了还可以考虑门卫: tellWeightState :: Int -> String tellWeightState x | x > 140 = " Too Fat" | x | otherwise = " Oll Korrect " (反正俺是感觉比if-else,switch好用得多)
-----------分割线----- 7. list comprehension 如果想生成一个列表(甚至是无穷长度的),复杂的写法就是写一个函数然后返回符合要求的列表--但在haskell只需要像数学里的集合一样写就可以达到预期目标!: >lst = [x^2 | x 试试看: >take lst 4 [1, 4, 9, 16] 而且就算是Python来写这段代码,也仍要更多的代码量(字符数),而且并不是:无穷的 你只能这样: lst = [ x * x for x in range(1, 4)] 这样直接得到拥有四个元素的列表,但如果我需要更多呢,下一步就是函数化了吧,于是又增加了代码量 虽然haskell里的这种写法也是语法糖,但是可比Python甜得多
8. lambda 同样是相较于Python Python对lambda有很大的限制(只允许有一条语句) 但haskell中对lambda函数没有限制 这个例子在「Learn You a Haskell」里的对bracketOnError的使用中有体现 而且...lambda在haskell里很_简_短: Python: foo = lambda x : x + 2 Haskell : foo = \x -> x + 2 上例在haskell里甚至可以更短,下一点讨论 9. 部分应用 上例的haskell代码可以直接简写为: foo = (+ 2) 这就叫部分应用,函数组合利用的也正是这种原理,说到底都是函数科里化带来的好处