Haskell - `div` 的奇怪截断行为

Haskell - Strange truncation behavior of `div`

在 ghci 中我得到以下信息:

λ> -1 `div` 2
0

但是:

λ> map (`div` 2) [-1]
[-1]

问题出现在我使用函数divPair:

divPair :: (Int, Int) -> Int -> (Int, Int)
divPair (a, b) n = (a `div` n, b `div` n)

λ> divPair (-1, -2) 2
(-1,-1)

这对我来说真的是一个惊喜,因为我预计它会产生 (0, -1)

这里发生了什么?我想我并没有真正理解 Haskell 中的 div

那是因为 -1 `div` 2 实际上被解析为 -(1 `div` 2) 等于 -0 或者只是 0 因为 1 `div` 2 等于 0。你应该使用 (-1) `div` 2.

Prelude> -(1 `div` 2)
0
Prelude> (-1) `div` 2
-1