
On Dec 30, 2007 3:43 AM, Jonathan Cast
On 29 Dec 2007, at 9:31 PM, alex wrote:
Hi there.
If someone can tell me why I am getting type ambiguity in the following code:
class (Ord s, Num s) => Scalar s where zero :: s
class Metric m where delta :: Scalar s => m -> m -> s
Just to clear up common confusion: the caller chooses s here, not the delta function. So delta has to work for any choice of s the caller chooses (as long as it is an instance of Scalar).
(=~) :: m -> m -> Bool (/~) :: m -> m -> Bool
(=~) a b = (delta a b) <= zero
What instance of Scalar do you want delta to return here? There's no way for the compiler to deduce that information. What you probably want is a fundep or associated type, associating a single choice of scalar for each metric: class (Scalar (Field m)) => Metric m where type Field m :: * delta :: m -> m -> Field m ... instance Metric Double where type Field Double = Double delta = (-) ... Luke