Haskell 模类似于 JavaScript(考虑符号并适用于非整数)

问题描述 投票:0回答:1

在 JavaScript 中:

console.log(13 % 5);
// Expected output: 3

console.log(-13 % 5);
// Expected output: -3

我在 Haskell 中也需要同样的东西。我做到了

:{
modulo :: Double -> Int -> Double
modulo a p = 
    let p' = fromIntegral p
    in
    if a > 0 
        then a - fromIntegral(p * floor(a/p'))  
        else a - fromIntegral(p * ceiling(a/p'))
:}

这似乎有效(至少我发现与 JavaScript 的结果相同)。有更好的办法吗

编辑

rem
相反,它应该适用于
Double
a
:

ghci> modulo (-13.5) 5
-3.5
haskell modulo
1个回答
1
投票

这个已经存在了,这是

rem :: Integral a => a -> a -> a
:

ghci> 13 `rem` 5
3
ghci> (-13) `rem` 5
-3

Haskell 有两对关于除法和取模的函数:

div
mod
,它们向负无穷大截断;以及
quot
rem
向零截断。

或对于

RealFrac
类型:

fracRem :: (RealFrac a, Integral b) => a -> b -> a
fracRem x y = x - fromIntegral (y * (truncate x `quot` y))
© www.soinside.com 2019 - 2024. All rights reserved.