[Haskell-beginners] I need advice on design

Amy de Buitléir amy at nualeargais.ie
Mon Dec 28 12:14:53 EST 2009

I'm building a library of components for artificial neural networks.
I'm used to object-oriented languages, so I'm struggling a bit to
figure out how to do a good design in a functional programming
language like Haskell.

Q1: I've come up with two designs, and would appreciate any advice on
improvements and what approach to take.

===== Design #1 =====
class Neuron n where
  activate :: [Double] -> n -> Double
  train :: [Double] -> Double -> n -> n

...and then I would have instances of this typeclass. For example:

data Perceptron = Perceptron {
        weights :: [Double],
        threshold :: Double,
        learningRate :: Double
      } deriving (Show)

instance Neuron Perceptron where
  activate inputs perceptron = ...
  train inputs target perceptron = ...

The disadvantage of this approach is that I need to define and name
each instance of neuron before I can use it. I'd rather create a
neuron on-the-fly by calling a general-purpose constructor and telling
it what functions to use for activation and training. I think that
would make it easier to re-use activation and training functions in
all sorts of different combinations. So I came up with...

===== Design #2 =====
data Neuron =
    Neuron {
        weights :: [Double],
        activate :: [Double] -> Double,
        train :: [Double] -> Double -> Neuron

Q2: I thought there might be some way to define a function type, but
the following doesn't work. Is there something along these lines that
would work?

type activationFunction = [Double] -> Double

More information about the Beginners mailing list