make [(Matrix Double,Vector Double)]一个Num的实例

时间:2016-07-21 16:54:59

标签: haskell

我定义了:

type Network = [(Matrix Double,Vector Double)]

其中Matrix和Vector来自hmatrix库。从hmatrix的文档中可以看出,Matrix Double和Vector Double已经是Num的实例。由于我需要添加和减少网络安静,我还希望网络成为Num的一个实例。我试过了

instance Num Network where
  (+) = zipWith (\(m,v) (n,w) -> (m+n,v+w))
  (-) = zipWith (\(m,v) (n,w) -> (m-n,v-w))
  (*) = zipWith (\(m,v) (n,w) -> (m*n,v*w))

但我收到错误:非法实例声明。

1 个答案:

答案 0 :(得分:5)

Alexis King的评论是正确的,以便您编译当前的代码。但是,为newtype制作Network可能是更好的做法 - 这样您根本不需要使用任何语言扩展。

newtype Network = Network [(Matrix Double,Vector Double)]

instance Num Network where
  (Network n1) + (Network n2) = Network $ zipWith (\(m,v) (n,w) -> (m+n,v+w)) n1 n2
  (Network n1) - (Network n2) = Network $ zipWith (\(m,v) (n,w) -> (m-n,v-w)) n1 n2
  (Network n1) * (Network n2) = Network $ zipWith (\(m,v) (n,w) -> (m*n,v*w)) n1 n2