我想弄清楚什么是错的.似乎类型有问题,但单独使用相同的表达式可以正常工作.
这是代码:
a = [9, 4, 12, 0, -6, 16] :: [Int]
qsort:: [Int] -> [Int]
qsort [] = []
qsort [x] = [x]
qsort xs = (qsort l)++(qsort r)
where m = (realToFrac(sum xs)) / (realToFrac(length xs))
l = filter (<=m) xs
r = filter (>m) xs
main::IO()
main = do
print (show (qsort a))
Run Code Online (Sandbox Code Playgroud)
它抛出:
main.hs:7:36:
No instance for (Fractional Int)
arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Int)
In the expression: (realToFrac (sum xs)) / (realToFrac (length xs))
In an equation for `m':
m = realToFrac (sum xs) / (realToFrac (length xs))
In an equation for `qsort':
qsort xs
= (qsort l) ++ (qsort r)
where
m = realToFrac (sum xs) / (realToFrac (length xs))
l = filter (<= m) xs
r = filter (> m) xs
Run Code Online (Sandbox Code Playgroud)
但这很有效:
a = [9, 4, 12, 0, -6, 16] :: [Int]
main::IO()
main = do
print (show ( (realToFrac(sum a)) / (realToFrac(length a)) ))
Run Code Online (Sandbox Code Playgroud)
你的m定义给出了一些类型Fractional.但是你比较m于Int在定义l和r其迷惑编译器.以下将做到这一点:
a = [9, 4, 12, 0, -6, 16] :: [Int]
qsort:: [Int] -> [Int]
qsort [] = []
qsort [x] = [x]
qsort xs = (qsort l)++(qsort r)
where m = realToFrac(sum xs) / (realToFrac(length xs))
l = filter ((<=m) . fromIntegral) xs
r = filter ((>m) . fromIntegral) xs
main::IO()
main = do
print (show (qsort a))
Run Code Online (Sandbox Code Playgroud)
realToFrac(sum xs) / (realToFrac(length xs))确实有效,但其结果是一个小数.所以在你的代码中m是一个小数.但是你要比较m列表中的项目,即Ints.由于您只能比较相同类型的值而Ints不是小数,因此会导致类型错误.
要解决您的问题,您可以使用整数除法(div)或将列表中的整数转换为小数,然后再与它们进行比较m.