我在Haskell中创建了一个函数,它只将列表中的evens减半,我遇到了问题.当我运行编译器时,它抱怨你不能执行int的划分,并且我需要一个小数int类型声明.我已经尝试将类型声明更改为float,但这只是生成了另一个错误.我已经在下面包含了该函数的代码,并希望获得任何形式的帮助.
halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
| otherwise = x/2:halfEvens xs
Run Code Online (Sandbox Code Playgroud)
谢谢你的阅读.
Joe*_*ams 42
使用div
,执行整数除法:
halfEvens :: [Int] -> [Int]
halfEvens [] = []
halfEvens (x:xs) | odd x = halfEvens xs
| otherwise = x `div` 2 : halfEvens xs
Run Code Online (Sandbox Code Playgroud)
该(/)
函数需要其类型在Fractional类中的参数,并执行标准除法.该div
函数需要其类型在Integral类中的参数,并执行整数除法.
更准确地说,div
并且mod
向负无穷大方向转.他们的堂兄弟,quot
和rem
,表现得像用C整数除法和圆形趋向于零. div
并且mod
在进行模运算时通常是正确的(例如,在计算给定日期的星期几时),quot
而且rem
稍微快一点(我认为).
在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]
Run Code Online (Sandbox Code Playgroud)