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