haskell - How should I specify the type in a instance statement when there is a type class restriction? -
i trying define simple data structure suppose add infinity element type under num. put under defined class numcontainer, has method fromnum construct numwithinf using regular num. code straight forward.
data numwithinf = infinity | finite deriving show class numcontainer k fromnum :: num => -> k instance num => numcontainer (numwithinf a) fromnum x = finite x however when ran it, ghci gave me following error:
hw.hs:7:24: not deduce (a ~ a1) context (num a) bound instance declaration @ hw.hs:6:10-45 or (num a1) bound type signature fromnum :: num a1 => a1 -> numwithinf @ hw.hs:7:5-24 `a' rigid type variable bound instance declaration @ hw.hs:6:10 `a1' rigid type variable bound type signature fromnum :: num a1 => a1 -> numwithinf @ hw.hs:7:5 in first argument of `finite', namely `x' in expression: finite x in equation `fromnum': fromnum x = finite x failed, modules loaded: none. i understand says x in finite x doesn't have same type a in signature fromnum :: num => -> k. how should specify this?
a simple solution (i.e. 1 not resort fancy type system trickery) making class work types of kind * -> * rather *. in practice, means define as:
class numcontainer k fromnum :: num => -> k -- result type parametrised on `a` the instance becomes:
instance numcontainer numwithinf fromnum x = finite x note there no place put num constraint in instance. unnecessary anyway - constraint in type of fromnum enough already.
Comments
Post a Comment