31

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)

フィールド名のアンダースコアは、少なくともHaskellの慣習によれば、コンパイラにとっては意味がありませんか?

4

4 に答える 4

27

無関係なパターンを表すアンダースコアに類推すると、たとえばfst (x, _) = x、アンダースコア接頭辞 (レコード フィールドまたはその他) は、コードを読む人が識別子を無視する必要があること、または特定の種類のユーザー インタラクションに対してコンパイラによって無視されることを示すために使用されます。 、 なぜか名前が付けられていたのに。

これは単なる慣例ではなく、Haskell Report で明示的に述べられていることに基づいていることに注意してください。

アンダースコア (_) は小文字として扱われ、小文字が使用できる場所であればどこでも使用できます。ただし、「_」自体は​​予約済みの識別子であり、パターンでワイルドカードとして使用されます。未使用の識別子に対する警告を提供するコンパイラは、アンダースコアで始まる識別子に対するそのような警告を抑制することをお勧めします。これにより、プログラマーは、使用されないと予想されるパラメーターに「_foo」を使用できます。

1つの例は、レコードフィールドに基づいてレンズを生成する一般的な例のように、アンダースコアなしで同等の識別子を定義するTemplate Haskellによる使用を意図した定義です(これはあなたの例が行っていることだと思います)。この場合、識別子は実際の定義よりも TH への入力になります。TH によって生成されたコードは、実際にはアンダースコアで始まる識別子を使用する場合と使用しない場合があります。

ただし、上記以外では、アンダースコア プレフィックスは通常の小文字の識別子と何ら変わりはありません。

于 2012-10-05T14:05:21.930 に答える
12

テンプレート Haskell コードは、アンダースコアで始まる識別子を探すことがあります。

たとえば、アンダースコアはレンズ生成を自動化するために使用されます。

于 2012-10-05T12:27:41.587 に答える
3

これは単なる優れたプログラミング手法です。

Haskell のレコード フィールド ラベルは、実際には最上位の名前付き関数であるため、モジュールの名前空間を汚染します。フィールド ラベルにアンダースコアを追加すると、同じ名前の別の関数を自由に定義できることを意味します。

于 2012-10-05T14:07:27.400 に答える