麻烦与Haskell条件

时间:2013-05-14 10:00:52

标签: haskell conditional-statements

我是Haskell的初学者,在下一个街区遇到麻烦:

up_heap :: Num a => [a] -> [a] -> [a]
up_heap heap (h:t) =
let ppos = quot (length heap) 2 in
        case ((ppos > 0) && ((heap !! ppos) > h)) of
            True ->
                let (upper, (p:lower)) = splitAt ppos heap in
                    up_heap upper (h:lower) ++ (p:t)
            False ->
                heap ++ h:t

下一个错误:无法推断使用'>'

产生的(Ord a)

如何改善这个?

2 个答案:

答案 0 :(得分:6)

您在>元素heap(元素)上使用Num a => a>Ord类型类的一部分,正如您在文档(http://hackage.haskell.org/packages/archive/base/3.0.3.1/doc/html/GHC-Num.html)中看到的那样,实现Num的类型不一定实现Ord。< / p>

class (Eq a, Show a) => Num a where

在类型签名中添加约束,例如(Num a, Ord a) => ...

答案 1 :(得分:1)

我也是初学者。我一直在做一个小图表,这可能对你有所帮助:

Eq   -- specifies the functions: (==) (/=)  
        Also, a required typeclass for a variable if:  
            1) you check to see if a variable is in a list with the `elem` list function
            2) a variable is being pattern matched against a specific value
            3) you pass a variable to another function that requires its arg to be (Eq a)

Ord  -- specifies the functions: (<) (<=) (>) (>=)
            (Ord implements Eq)

Num  -- specifies the functions: (+) (-) (*) 
             but NOT (/) which is part of the Fractional typeclass
             (Num implements Show, Eq)

             ghci> :t (*)
             (*) :: (Num a) => a -> a -> a

Integral   -- specifies the functions: mod, div(integer division operator)                
                 Both Int and Integer(= really big ints) implement the 
                 Integral typeclass
                 (Integral implements Real(which implements both Ord and Num) )

Fractional -- specifies the function: (/)
                 Float, Double, Rational types implement Fractional
                 (Fractional implements Num)

当我第一次写我的类型声明时,我不太担心我可能需要的'类型约束',所以我可能会写:

myfunc :: a -> a -> a

然后在我编写函数之后,我查看函数,并确定在a上使用了哪些运算符。如果正在添加一个,我查看图表并看到Num是具有(+)运算符的类型类。如果将a与&lt;进行比较,那么我查看图表并看到Ord有比较运算符。此时,我在类型声明中添加了东西,以确保指定了所有必需的类型类:

myfunc :: (Num a, Ord a) => a -> a -> a

类型'a'代表任何类型,类型约束,(Num a,Ord a),例如,“保持在那里,没有任何类型将为'a'做。将会有一些添加和比较完成,因此'a'的类型被限制为任何类型到实现Num和Ord中的函数的类型。