When is the difference between quotRem and divMod useful?

前端 未结 3 1277
猫巷女王i
猫巷女王i 2020-12-02 12:19

From the haskell report:

The quot, rem, div, and mod class methods satisfy these laws if y is non-zero:

(x `quot` y)*y + (x `rem`          


        
3条回答
  •  自闭症患者
    2020-12-02 12:42

    A simple example where it would matter is testing if an integer is even or odd.

    let buggyOdd x = x `rem` 2 == 1
    buggyOdd 1 // True
    buggyOdd (-1) // False (wrong!)
    
    let odd x = x `mod` 2 == 1
    odd 1 // True
    odd (-1) // True
    

    Note, of course, you could avoid thinking about these issues by just defining odd in this way:

    let odd x = x `rem` 2 /= 0
    odd 1 // True
    odd (-1) // True
    

    In general, just remember that, for y > 0, x mod y always return something >= 0 while x rem y returns 0 or something of the same sign as x.

提交回复
热议问题