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
。但无论如何我都不会想到使用它,所以谢谢你的解释。