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) 这就叫部分应用,函数组合利用的也正是这种原理,说到底都是函数科里化带来的好处
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn