
Thanks to you all, I think I understand better.
instance Search Id Id where
search _ _ i = only (FoundId i)
Is too restrictive on the first type, so declaring instead:
instance Search id Id where
search _ _ i = only (FoundId i)
Fixed the issue!! Now the initial "id" is not Id and everybody is
happy (and the code still seems to work as intended)
thanks again
JP
On Fri, Mar 18, 2011 at 2:17 PM, Daniel Fischer
On Friday 18 March 2011 13:35:22, JP Moresmau wrote:
These are GHC types, but here is a self-contained example: {-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
data Id=Id String
data Result id =ResultId Id | ResultGen id
data Sig id=IdSig Id | SigGen id
class Search id a | a -> id where search :: a -> Result id
instance Search Id Id where search i = ResultId i
instance (Search id id) => Search id (Sig id) where search (SigGen g) = search g search (IdSig i) = search i
The last line fails. I don't understand why this doesn't compile.
In (IdSig i), i has type Id, hence
search i :: Result Id
but you want something of type `Result id'. Fortunately it's easy to transform, since search i is a ResultId, so
instance (Search id id) => Search id (Sig id) where search (SigGen g) = search g search (IdSig i) = case search i of ResultId y -> ResultId y _ -> error "foo"
compiles (and probably does what you want).
-- JP Moresmau http://jpmoresmau.blogspot.com/