Haskell/語法糖
外觀
< Haskell
語法糖 指的是程式語言中任何冗餘的語法型別,它對於主語法是冗餘的,但(希望)使程式碼更容易理解或編寫。
- 有關更多資訊,請參閱關於函式的更多內容章節。
| 描述 | 甜的 | 不甜的 |
|---|---|---|
| 中綴運算子 | a `mappend` b 1+2 |
mappend a b (+) 1 2 |
| 部分 | (+2) (3-) |
\x -> x + 2 \x -> 3 - x |
| 一元負號[1] | -x |
negate x |
| 元組[2] | (x,y) |
(,) x y |
- 有關更多資訊,請參閱Haskell/變數和函式章節。
| 描述 | 甜的 | 不甜的 |
|---|---|---|
| 函式定義 | f x y = x * y |
f = \x y -> x * y進一步去糖化成 f = \x -> \y -> x * y |
| 模式匹配 | f [] = 0
f (' ':xs) = f xs
f (x:xs) = 1 + f xs
|
f = \l -> case l of
[] -> 0
(' ':xs) -> f xs
(x:xs) -> 1 + f xs
|
| 描述 | 甜的 | 不甜的 |
|---|---|---|
| 列表 | [1,2,3] |
1:2:3:[]進一步去糖化成 (:) 1 ((:) 2 ((:) 3 [])) |
| 字串 | "abc" |
['a','b','c']進一步去糖化成 'a':'b':'c':[]進一步去糖化成 (:) 'a' ((:) 'b' ((:) 'c' [])) |
| 算術序列 | [1..5] [1,3..9] [1..] [1,3..] |
enumFromTo 1 5 enumFromThenTo 1 3 9 enumFrom 1 enumFromThen 1 3 |
| 列表推導到函式 | [ x | (x,y) <- foos, x < 2 ] |
let ok (x,y) = if x < 2 then [x] else [] in concatMap ok foos |
| 列表推導到列表單子函式 | [ x | (x,y) <- foos, x < 2 ]
[ (x, bar) | (x,y) <- foos,
x < 2,
bar <- bars,
bar < y ]
|
foos >>= \(x, y) ->
guard (x < 2) >>
return x
foos >>= \(x, y) -> guard (x < 2) >>
bars >>= \bar ->
guard (bar < y) >>
return (x, bar)
-- or equivalently
do (x, y) <- foos
guard (x < 2)
bar <- bars
guard (bar < y)
return (x, bar)
|
| 描述 | 甜的 | 不甜的 |
|---|---|---|
| 建立 | data Ball = Ball
{ x :: Double
, y :: Double
, radius :: Double
, mass :: Double
}
|
data Ball = Ball
Double
Double
Double
Double
x :: Ball -> Double
x (Ball x_ _ _ _) = x_
y :: Ball -> Double
y (Ball _ y_ _ _) = y_
radius :: Ball -> Double
radius (Ball _ _ radius_ _) = radius_
mass :: Ball -> Double
mass (Ball _ _ _ mass_) = mass_
|
| 模式匹配 | getArea Ball {radius = r} = (r**2) * pi
|
getArea (Ball _ _ r _) = (r**2) * pi |
| 更改值 | moveBall dx dy ball = ball {x = (x ball)+dx, y = (y ball)+dy}
|
moveBall dx dy (Ball x y a m) = Ball (x+dx) (y+dy) a m |
| 描述 | 甜的 | 不甜的 |
|---|---|---|
| 排序 | do putStrLn "one" putStrLn "two" |
putStrLn "one" >> putStrLn "two" |
| 單子繫結 | do x <- getLine putStrLn $ "You typed: " ++ x |
getLine >>= \x -> putStrLn $ "You typed: " ++ x |
| Let 繫結 | do let f xs = xs ++ xs putStrLn $ f "abc" |
let f xs = xs ++ xs in putStrLn $ f "abc" |
| 最後一行 | do x |
x |
| 描述 | 甜的 | 不甜的 |
|---|---|---|
| if-then-else | if x then y else z |
case x of True -> y False -> z |
Haskell 程式碼中的數字(如 5)被解釋為 fromInteger 5,其中 5 是一個 Integer。這使得字面量可以被解釋為 Integer、Int、Float 等。浮點數(如 3.3)也是如此,它們被解釋為 fromRational 3.3,其中 3.3 是一個 Rational。GHC 有 OverloadedStrings 擴充套件,它允許對來自 Data.ByteString 模組的字串型別(如 String 和 ByteString)進行相同的操作。
型別 [Int] 等效於 [] Int。這使得它很明顯這是一個對 [] 型別建構函式(種類 * -> *)到 Int(種類 *)的應用。
類似地,(Bool, String) 等效於 (,) Bool String,對於更大的元組也是如此。
函式型別具有相同的糖:Int -> Bool 也可以寫成 (->) Int Bool。
- 有關佈局的更多資訊,請參閱縮排章節。