我是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)如何改善这个?
答案 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中的函数的类型。