Neuron is not the same thing as [Double]; it is instead a wrapper around [Double]. Thus you must unwrap the value before you can use it like a list:
recall :: Neuron -> [Double] -> Double
recall (Neuron ws) xs = y
where y = sum (zipWith (*) ws (-1:xs))
Though I have another issue with your code. In this example, since you know that a Neuron must wrap a list of specifically 3 Doubles, you should enforce that with the type system, instead defining Neuron as:
newtype Neuron = Neuron (Double, Double, Double)
deriving (Read, Show)
recall :: Neuron -> [Double] -> Double
recall (Neuron (w1, w2, w3)) xs = y (xs ++ repeat 0)
where y (x2:x3:_) = w1 * (-1) + w2 * x2 + w3 * x3
Yes, you lose out on using zipWith and sum, but that's really just obscuring a simpler underlying calculation. There's no need to use generic functions when only one specific case will ever be used.
Note also the use of newtype instead of data. newtype gives you potentially more performant derived implementations of Read and Show and also provides access to advanced tools like Generalized Newtype Deriving, which you may not care about now, but later may be very useful. In general, using newtype instead of data for datatypes that just wrap another datatype is a good habit to get into.
In a comment, @leftroundabout also mentions that if the data do not naturally form a tuple or vector, you should not wrap a tuple, in which case the code would look like this:
data Neuron = Neuron { property1 :: Double
, property2 :: Double
, property3 :: Double
} deriving (Read, Show)
recall :: Neuron -> [Double] -> Double
recall (Neuron w1 w2 w3) xs = y (xs ++ repeat 0)
where y (x2:x3:_) = w1 * (-1) + w2 * x2 + w3 * x3
Neuronis not a list, it contains a list. Tryrecall (Neuron ws) xs = ...(Double, Double, Double)data Neuron = Neuron !Double !Double !Double, probably. But, why would it be always exactly 3?V3.