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
类型的值无法区分,并且可以在其他位置使用。这只是同一类型的另一个名称,仅此而已。谢谢!这让我明白了一些事情。