
On Fri, Jul 24, 2009 at 08:44:32AM -0400, Brent Yorgey wrote:
On Fri, Jul 24, 2009 at 09:41:34AM -0300, Rafael Gustavo da Cunha Pereira Pinto wrote:
class EditAction e a | e -> a where apply :: a -> e -> a
It's a functional dependency: the e -> a means that the type e determines the type a, that is, there can only be one instance of EditAction for any particular type e.
Alternatively you could write that class using a type family: class EditAction e where type Text e :: * apply :: Text e -> e -> Text e (I don't know if "Text e" is a good name, but Haskell-wise this should do the same trick as the fundep class.) One example of an instance (out of the top of my head): data Editor = Editor {text :: String, ...} data EditorAction = Prepend String | ... instance EditAction EditorAction where type Text EditorAction = Editor apply editor (Prepend s) = editor {text = s ++ text editor} HTH, -- Felipe.