【问题标题】:Getting a type mismatch error with the Haskell zipWith function使用 Haskell zipWith 函数获取类型不匹配错误
【发布时间】:2020-11-24 06:51:51
【问题描述】:

我是 Haskell 的新手。我有一个Neuron 数据类型,它拥有一个Double 值列表:

data Neuron = Neuron [Double]
      deriving  (Eq, Read, Show)

我正在尝试对 Neuron 拥有的列表和另一个列表中的每个元素求和:

sommeNeuron :: Neuron -> [Double] -> Neuron 
sommeNeuron n1 n2 = n'
              where {
                     --n' = Neuron(zipWith (+) n1 n2);
                     n' = zip n1 n2
              }

这给了我一个编译时错误:

无法将预期类型“[a]”与实际类型“神经元”匹配

【问题讨论】:

  • 您的两个参数具有不同的类型,因此将它们称为 n1 和 n2 并不是一个好主意。假设这些数字是权重,而您的 n2 是现有权重的增量列表。所以你可以调用初始权重 ws0、增量 ws1 和结果神经元的权重 ws2。所以你的函数的主体应该是这样开始的:sommeNeuron (Neuron ws0) ws1 = Neuron ws2 where {TODO must define ws2 as a function of ws0 and ws1}.

标签: haskell types type-mismatch algebraic-data-types custom-data-type


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2016-05-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    相关资源
    最近更新 更多