当ghc建议将构造函数添加到导入列表时,我的数据构造函数导入/使用有什么问题



我有下面一行代码,我试图提取内部原始类型,这样我就可以直接使用它:

SDL.Internal.Types.Window (rawWindow) = window

我的导入看起来像:

import qualified SDL.Internal.Types     (Window)

我得到的错误如下;我似乎已经在做它所暗示的了。

%    /home/brandon/workspace/hico/src/Hico/Game.hs:273:5: error:
Not in scope: data constructor `SDL.Internal.Types.Window'
Perhaps you want to add `Window' to the import list
in the import of `SDL.Internal.Types' (src/Hico/Game.hs:34:1-48).
|
273 |     SDL.Internal.Types.Window (rawWindow) = window
|     ^^^^^^^^^^^^^^^^^^^^^^^^^

Types.hs文件的内容很短,似乎没有给我任何线索:

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
module SDL.Internal.Types
( Joystick(..)
, Window(..)
, Renderer(..)
) where
import Data.Data (Data)
import Data.Typeable
import GHC.Generics (Generic)
import qualified SDL.Raw as Raw
newtype Joystick = Joystick { joystickPtr :: Raw.Joystick }
deriving (Data, Eq, Generic, Ord, Show, Typeable)
newtype Window = Window (Raw.Window)
deriving (Data, Eq, Generic, Ord, Show, Typeable)
-- | An SDL rendering device. This can be created with 'SDL.Video.createRenderer'.
newtype Renderer = Renderer Raw.Renderer
deriving (Data, Eq, Generic, Ord, Show, Typeable)

通过编写

import qualified SDL.Internal.Types     (Window)

您只导入类型Window,而不导入其构造函数。要导入一个数据类型及其构造函数的一些有限子集,可以编写(使用Maybe作为示例,因为我不知道SDL的类型(:

import Prelude (Maybe(Just))

此导入将允许您在类型注释中使用Maybe,并使用Just构造函数进行模式匹配或创建Maybe a类型的新值,但在这两种情况下都不能使用Nothing。

请注意,上面的操作非常不寻常:通常情况下,您需要一个类型的所有构造函数(这样您就可以构建和使用该类型的任何值(,或者不需要它们(这样您的函数就可以接收或返回由其他函数构建和使用的该类型的值(。

如果你想要一个类型的所有构造函数,你可以使用你列出的模块导出定义中使用的确切语法:(..)意味着"这个类型的所有构造器":

import qualified SDL.Internal.Types     (Window(..))

最新更新