Haskell 包装数据.Vec类型
我想用我自己的类型包装一些类型的Haskell 包装数据.Vec类型,haskell,types,Haskell,Types,我想用我自己的类型包装一些类型的Data.Vec,但它似乎不起作用。例如,我想拥有自己的Vec3,这将是一个Vec3F,所以我做了如下操作: 类型。h: module Types ( Vec3(..) ) where import qualified Data.Vec as V type Vec3 = V.Vec3 Float import Types vect :: Vec3 vect = Vec3 3 2 4 main = return () Main.hs: module T
Data.Vec
,但它似乎不起作用。例如,我想拥有自己的Vec3
,这将是一个Vec3F
,所以我做了如下操作:
类型。h:
module Types
( Vec3(..)
) where
import qualified Data.Vec as V
type Vec3 = V.Vec3 Float
import Types
vect :: Vec3
vect = Vec3 3 2 4
main = return ()
Main.hs:
module Types
( Vec3(..)
) where
import qualified Data.Vec as V
type Vec3 = V.Vec3 Float
import Types
vect :: Vec3
vect = Vec3 3 2 4
main = return ()
GHC向我投诉并给出以下错误:
Main.hs:4:8: Not in scope: data constructor `Vec3'
是否因为我的新类型与Data.Vec
类型同名,尽管我进行了限定导入
如果是这样的话,有没有办法在不更改类型名称的情况下执行此操作
如果不是,我如何从我的
类型
模块中仅导出某些类型的数据。Vec
?Vec3
不是数据构造函数,它是一个(在本例中,是一个类
)。也许您可以将自己的包装器包装在构造函数周围,以实现所需的功能
makeVec :: (Double,Double,Double) -> Vec3
makeVec = V.fromXYZ -- TODO some float mangling
您正在使用软件包,但我想使用。问题是我可以像这样直接构造
V.Vec3F
:V.Vec3F 3 5 2
,而它不适用于我自己定义为type Vec3=V.Vec3F
@elignord的Vec3
的Vec3
的类型构造函数。你根本不能用它来构造值。如果我说type IntList=[Int]
,我仍然必须使用[Int]
的数据构造函数来构造IntList
类型的东西,因为它只是一个别名。另一个例子是type Environment=Data.Map.Map String
,我可以有一个Environment
类型的值,但它与Data.Map.Map String
类型的值无法区分,并且可以在其他位置使用。这只是同一类型的另一个名称,仅此而已。谢谢!这让我明白了一些事情。