当Haskell记录访问器以下划线引导时通常意味着什么?

dan*_*dan 30 haskell

HaskellNet库的一个例子:

data MailboxInfo = MboxInfo { _mailbox :: MailboxName
                            , _exists :: Integer
                            , _recent :: Integer
                            , _flags :: [Flag]
                            , _permanentFlags :: [Flag]
                            , _isWritable :: Bool
                            , _isFlagWritable :: Bool
                            , _uidNext :: UID
                            , _uidValidity :: UID
                            }
                 deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

字段名称中的下划线是否意味着什么,如果不是编译器,那么至少根据Haskell约定?

C. *_*ann 26

类似于表示不相关模式fst (x, _) = x的下划线,例如,下划线前缀(在记录字段或其他方面)用于指示读取代码的任何人都应忽略标识符,或者编译器可能忽略某些类型的用户交互. ,即使它因某种原因而得名.

请注意,这不仅仅是一个约定,而是基于Haskell报告中明确陈述的内容:

下划线"_"被视为小写字母,可以出现在小写字母的任何地方.但是,"_"本身就是一个保留的标识符,在模式中用作通配符.鼓励为未使用的标识符提供警告的编译器禁止以下划线开头的标识符的此类警告.这允许程序员使用"_foo"作为他们期望未使用的参数.

一个例子是拟由Template Haskell使用的定义,然后定义没有下划线的等效标识符,如在基于记录字段生成镜头的常见示例中(我猜你的例子正在做什么).在这种情况下,标识符比实际定义更多地输入TH; 由TH生成的代码实际上可能使用或不实际使用下划线前缀标识符.

但是,除了上述内容之外,下划线前缀与常规小写标识符没有任何不同.

  • 您可以在此处查看GHC如何处理以下划线为前缀的标识符和警告:http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/options-sanity.html (3认同)

Pub*_*bby 11

模板Haskell代码有时会查找以下划线开头的标识符.

例如,下划线用于自动生成镜头.