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------------------------------------
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