
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