#haskell #types #type-mismatch #algebraic-data-types #custom-data-type
#haskell #типы #несоответствие типа #алгебраические типы данных #пользовательский тип данных
Вопрос:
Я новичок в Haskell. У меня есть Neuron
тип данных, которому принадлежит список Double
значений:
data Neuron = Neuron [Double]
deriving (Eq, Read, Show)
Я пытаюсь вычислить сумму каждого элемента в списке, принадлежащем нейрону, и в другом списке:
sommeNeuron :: Neuron -> [Double] -> Neuron
sommeNeuron n1 n2 = n'
where {
--n' = Neuron(zipWith ( ) n1 n2);
n' = zip n1 n2
}
Это дает мне ошибку во время компиляции:
Не удалось сопоставить ожидаемый тип ‘[a]’ с фактическим типом ‘Neuron’
Комментарии:
1. Ваши два аргумента имеют разные типы, поэтому не очень хорошая идея называть их n1 и n2. Давайте предположим, что числа являются весами, а ваш n2 представляет собой список приращений для существующих весов. Таким образом, вы можете вызвать начальные веса ws0, приращения ws1 и веса результирующего нейрона ws2. Таким образом, тело вашей функции будет начинаться так:
sommeNeuron (Neuron ws0) ws1 = Neuron ws2 where {TODO must define ws2 as a function of ws0 and ws1}
.
Ответ №1:
Просто нужно настроить его,
sommeNeuron :: Neuron -> [Double] -> Neuron
sommeNeuron (Neuron n1) n2 = Neuron (zipWith ( ) n1 n2)
{-
Neuron n1 :: Neuron
n1 :: [Double]
n2 :: [Double]
zipWith ( ) n1 n2 :: [Double]
Neuron (zipWith ( ) n1 n2) :: Neuron
-}
поскольку ваш тип данных определяется как
data Neuron = Neuron [Double]
т.е. [Double]
список находится за «тегом» Neuron
. Это означает, что существует взаимосвязь
-- data Type
-- constructor
Neuron n1 :: Neuron
-------------------------------
n1 :: [Double]
-- variable
-- name