Haskell 如何声明此函数的类型?

Haskell 如何声明此函数的类型?,haskell,ghc,Haskell,Ghc,我正在使用库并尝试编写简单函数: import qualified Data.Vector.Generic as GV setCharges :: GV.Vector v Double => Network -> v Double -> Network setCharges n cs = n{nodes = GV.zipWith setCharge (nodes n) cs} 使用XFlexibleContextsghc接受类型声明,但在csv

我正在使用库并尝试编写简单函数:

import qualified Data.Vector.Generic as GV

setCharges :: GV.Vector v Double => 
              Network -> v Double -> Network
setCharges n cs = n{nodes = GV.zipWith setCharge (nodes n) cs}
使用
XFlexibleContexts
ghc接受类型声明,但在
cs
varibale附近投诉

Could not deduce (v ~ Vector)
我有

nodes n :: Data.Vector.Vector Node
setCharge :: Node -> Double -> Node

没有真正明白问题所在。

这正是GHC所说的:
setCharges
签名只要求
v
是类
Data.Vector.Generic.Vector
的某个实例。
网络
节点
字段OTOH始终是一种特殊类型,即
Data.Vector.Vector
,它确实是
Vector
类的一个实例,但也可以有其他类型。因此,您不能仅用其他类型替换此字段,不管它是否是
GV.Vector
的实例。但有一个通用函数可以在这些实例之间进行切换,使用该函数,您就可以:

setCharges n cs = n{nodes = GV.zipWith setCharge (nodes n) (GV.convert cs)}
或者,您可以设计
网络
记录,使
节点
字段实际上是多态的,即可以保存类的任意实例,而不是一种特定类型。这被称为存在主义:


但它通常被认为是一种反模式,至少如果没有特别的理由这样做的话。

这正是GHC所说的:
设置费用
签名只要求
v
是类
Data.Vector.Generic.Vector
的某个实例。
网络
节点
字段OTOH始终是一种特殊类型,即
Data.Vector.Vector
,它确实是
Vector
类的一个实例,但也可以有其他类型。因此,您不能仅用其他类型替换此字段,不管它是否是
GV.Vector
的实例。但有一个通用函数可以在这些实例之间进行切换,使用该函数,您就可以:

setCharges n cs = n{nodes = GV.zipWith setCharge (nodes n) (GV.convert cs)}
或者,您可以设计
网络
记录,使
节点
字段实际上是多态的,即可以保存类的任意实例,而不是一种特定类型。这被称为存在主义:


但它通常被认为是一种反模式,至少如果没有特别的理由走这条路的话。

Woha,我错过了
convert
。但无论如何我都不会想到使用它,所以谢谢你的解释。哇,我错过了
convert
。但无论如何我都不会想到使用它,所以谢谢你的解释。