Получение ошибки несоответствия типов с помощью функции Haskell zipWith

#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