Division in Haskell

后端 未结 2 344
深忆病人
深忆病人 2020-12-15 15:49

I\'m making a function in Haskell that halves only the evens in a list and I am experiencing a problem. When I run the complier it complains that you can\'t perform division

相关标签:
2条回答
  • 2020-12-15 16:36

    I should add that using map would simplify the code.

    HalfIfEven n
      | even n = n `div` 2
      | otherwise = n
    
    halfEvens = map halfIfEven
    
    0 讨论(0)
  • 2020-12-15 16:48

    Use div, which performs integer division:

    halfEvens :: [Int] -> [Int]
    halfEvens [] = []
    halfEvens (x:xs) | odd x = halfEvens xs
                     | otherwise = x `div` 2 : halfEvens xs
    

    The (/) function requires arguments whose type is in the class Fractional, and performs standard division. The div function requires arguments whose type is in the class Integral, and performs integer division.

    More precisely, div and mod round toward negative infinity. Their cousins, quot and rem, behave like integer division in C and round toward zero. div and mod are usually correct when doing modular arithmetic (e.g. when calculating the day of the week given a date), while quot and rem are slightly faster (I think).

    Playing around a bit in GHCi:

    > :t div
    div :: Integral a => a -> a -> a
    > :t (/)
    (/) :: Fractional a => a -> a -> a
    > 3 / 5
    0.6
    > 3 `div` 5
    0
    > (-3) `div` 5
    -1
    > (-3) `quot` 5
    0
    > [x `mod` 3 | x <- [-10..10]]
    [2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1]
    > [x `rem` 3 | x <- [-10..10]]
    [-1,0,-2,-1,0,-2,-1,0,-2,-1,0,1,2,0,1,2,0,1,2,0,1]
    
    0 讨论(0)
提交回复
热议问题