2

私は何が悪いのか理解しようとしています。型に問題があるように見えますが、同じ式だけで問題なく機能します。

コードは次のとおりです。

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))

それは投げます:

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

しかし、それはうまくいきます:

a = [9, 4, 12, 0, -6, 16] :: [Int]
main::IO()
main = do
    print (show (   (realToFrac(sum a)) / (realToFrac(length a))   ))
4

3 に答える 3

6

あなたのm定義は type の数を与えFractionalます。ただし、との定義を比較mすると、コンパイラが混乱します。以下はトリックを行います:Intlr

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))
于 2013-02-18T16:45:49.493 に答える
5

realToFrac(sum xs) / (realToFrac(length xs))動作しますが、その結果は小数です。したがって、コードmには小数があります。しかしm、Ints であるリスト内の項目と比較します。同じ型の値しか比較できず、Int は小数ではないため、型エラーが発生します。

問題を解決するには、整数除算 ( div) を使用するか、リスト内の整数を と比較する前に小数に変換しますm

于 2013-02-18T16:47:09.313 に答える
1

xをピボットとして使用できます。ここでは、「qsort(x:xs)」に一致するリストパターンが非常に役立ちます。

a = [9, 4, 12, 0, -6, 16] :: [Int]                                                                                    

qsort:: [Int] -> [Int]                                                                                                
qsort [] = []                                                                                                         
qsort (x:xs) = (qsort l) ++ [x] ++ (qsort r)                                                                           
    where   l = filter (<=x) xs                                                                                       
            r = filter (>x) xs                                                                                        

main::IO()                                                                                                            
main = putStrLn $ show $ qsort a   

 -- *Main> main                                                                                                           
 -- [-6,0,4,9,12,16] 

代替構文も: http: //hpaste.org/81793

于 2013-02-18T16:56:16.610 に答える