Hello (first post),
I have spent so many time learning typeclasses and thinking it was part of Haskell essence... and suddenly I read the discussion "[Haskell-beginners] Can fields in a record be optional?".
So typeclasses are not always recomended?

I'm implementing a Machine Learning framework and I am in a sort of related dilemma.

I found three ways of implementing the same distance function between "examples" (aka "attribute vectors" or simply "Float vectors" for mere mortals :) ):

[obs: "Example" datatype will be added more fields later]

--------------first------------------------------------
module ML where

data Example =
     Example [Float] deriving (Show)

class ExampleClass a where
     (distance) :: a →  a →  Float

instance ExampleClass Example where
   (Example atts1) distance (Example atts2) =
        sqrt $ sum $ map (λ(x, y) →  (x-y)↑2) $ zip atts1 atts2
=================================


--------------second------------------------------------
module ML where

data Example =
    Example {attributes :: [Float]} deriving (Show)

distance :: Example →  Example →  Float
distance ex1 ex2 =
        sqrt $ sum $ map (λ(x, y) →  (x-y)↑2) $
                zip (attributes ex1) (attributes ex2)
=================================


--------------third------------------------------------
module ML where

data Example =
       Example [Float] deriving (Show)

distance :: Example →  Example →  Float
distance (Example att1) (Example att2) =
      sqrt $ sum $ map (λ(x, y) →  (x-y)↑2) $
                zip (att1) (att2)
=================================


All three reserves the word "distance" for itself and the second reserves also the word "attributes".
How could I implement the module ML and which would be the best way  to set "attributes" outside the module?

Thanks


Davi