震惊小伙伴的单行代码●Haskell篇

几年前,函数式编程的复兴正值巅峰,一篇介绍 Scala 中 10 个单行函数式代码的博文在网上走红。很快地,一系列使用其他语言实现这些单行代码的文章也随之出现,比如 Haskell, Ruby, Groovy, Clojure, Python, C#, F#, CoffeeScript

每篇文章都令人印象深刻的揭示了这些语言中一些出色优秀的编程特征。编程高手们利用这些技巧提高编程速度、改进软件质量,编程初学者能从这些简洁的预防中学到各种编程语言的真谛。本《震惊小伙伴的单行代码系列》将逐一介绍这些各种编程语言单行代码文章,供大家学习参考。

1、让列表中的每个元素都乘以2

map (*2) [1..10]

2、求列表中的所有元素之和

foldl (+) 0 [1..1000]

-- or better

sum [1..1000]

3、判断一个字符串中是否存在某些词

import Data.List
let wordlist = ["monad", "monoid", "Galois", "ghc", "SPJ"]
let tweet = "This is an example tweet talking about SPJ interviewing with Galois"

or $ map (flip isInfixOf tweet) wordlist

-- or better

any (flip isInfixOf tweet) wordlist

4、读取文件

fileText <- readFile "data.txt"

let fileLines = lines fileText

-- or better

let fileLines = fmap lines $ readFile "data.txt"

5、祝你生日快乐!

mapM_ putStrLn ["Happy Birthday " ++ (if x == 3 then "dear NAME" else "to You") | x <- [1..4]]

6. 过滤列表中的数值

let (passed, failed) = partition (>60) [49, 58, 76, 82, 88, 90]

7. 获取XML web service数据并分析

下面的例子需要使用 curlxml 代码库,参考 RWH 里提供的安装方法。

import Network.Curl
import Text.XML.Light
import Control.Monad

let results = liftM parseXMLDoc $ liftM snd (curlGetString "http://search.twitter.com/search.atom?&q=haskell" [])

-- or better 

Control.Applicative
let results = parseXMLDoc . snd <$> curlGetString "http://search.twitter.com/search.atom?&q=haskell" []

8. 找到列表中最小或最大的一个数字

foldl1 min [14, 35, -7, 46, 98]
foldl1 max [14, 35, -7, 46, 98]

-- or better

minimum [14, 35, -7, 46, 98] 
maximum [14, 35, -7, 46, 98]

9. 并行处理

下面的例子需要使用 parallel 代码包。

import Control.Parallel
import Control.Parallel.Strategies

parMap rseq (*2) [1..100]

10. 素数生成器

let pgen (p:xs) = p : pgen [x|x <- xs, x `mod` p > 0]

take 40 (pgen [2..])
分享这篇文章:

One Response to 震惊小伙伴的单行代码●Haskell篇

  1. chaos  这篇文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

壹加壹等于