【发布时间】:2016-11-25 09:28:01
【问题描述】:
我定义了:
type Network = [(Matrix Double,Vector Double)]
其中 Matrix 和 Vector 来自 hmatrix 库。从 hmatrix 的文档来看,在我看来 Matrix Double 和 Vector Double 已经是 Num 的实例。由于我需要添加和减去 Networks quiet 很多,我还希望 Network 成为 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))
但我收到错误:非法实例声明。
【问题讨论】:
-
您需要打开
FlexibleInstances语言扩展来创建基于类型同义词的实例,就像您编写的那样。 GHC 错误消息甚至可能暗示这一点(与TypeSynonymInstaces一起,尽管FlexibleInstnaces暗示前者)。 -
@AlexisKing:你能把它作为答案吗?它实际上回答了问题,并且具有更好的可见性。
-
请不要这样做。这不是一个好主意。向量不是数字;逐元素乘法没有对一般向量有意义的语义。几乎可以肯定,也不适用于网络。不过,给它一个
VectorSpace实例可能很有意义,但你绝对应该将它包装在newtype中。 -
请注意,当您定义一个实例时,您应该定义所有类的操作。这包括例如
signum和abs。不这样做可能会导致您的程序崩溃,因为某些代码实际上使用了这些代码,它们最终会变成undefined。
标签: haskell