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

xji*_*xji 3 haskell division integer-division

在ghci我得到以下内容:

?> -1 `div` 2
0
Run Code Online (Sandbox Code Playgroud)

然而:

?> map (`div` 2) [-1]
[-1]
Run Code Online (Sandbox Code Playgroud)

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

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

?> divPair (-1, -2) 2
(-1,-1)
Run Code Online (Sandbox Code Playgroud)

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

这里发生了什么?我想我div在Haskell中并没有真正了解一些事情.

Dog*_*ert 10

这是因为-1 `div` 2实际被解析为-(1 `div` 2)它等于-0或只是01 `div` 2等于0.您应该使用(-1) `div` 2.

Prelude> -(1 `div` 2)
0
Prelude> (-1) `div` 2
-1
Run Code Online (Sandbox Code Playgroud)