Haskell语言速查
函数与类型
-- 类型签名
add :: Int -> Int -> Int
add x y = x + y
-- 函数组合
transform :: [String] -> [String]
transform = filter (not . null) . map (map toUpper)
-- Lambda 表达式
double = \x -> x * 2
evens = filter (\x -> x `mod` 2 == 0) [1..10]
模式匹配
-- 列表模式
head' :: [a] -> a
head' [] = error "empty list"
head' (x:_) = x
-- 阶乘
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
-- 守卫
classify :: Int -> String
classify n
| n < 0 = "negative"
| n == 0 = "zero"
| n < 10 = "small"
| otherwise = "large"
数据类型
-- 代数数据类型
data Shape = Circle Double
| Rectangle Double Double
| Triangle Double Double Double
area :: Shape -> Double
area (Circle r) = pi * r * r
area (Rectangle w h) = w * h
area (Triangle a b c) = ...
-- 记录语法
data Person = Person { name :: String, age :: Int }
alice = Person { name = "Alice", age = 28 }
olderAlice = alice { age = 29 } -- 更新
Maybe Monad
-- Maybe 用于安全计算
safeDiv :: Int -> Int -> Maybe Int
safeDiv _ 0 = Nothing
safeDiv x y = Just (x `div` y)
-- do 表示法
compute :: Int -> Int -> Maybe Int
compute x y = do
a <- safeDiv x y
b <- safeDiv a 2
return (a + b)
-- fmap 和 >>=
fmap (*2) (Just 5) -- Just 10
Just 5 >>= safeDiv 10 -- Just 2
Nothing >>= safeDiv 10 -- Nothing