1. ホーム
  2. haskell

Haskellの良いコーディング規約

2023-09-11 10:35:59

質問

誰かHaskellの良いコーディング標準へのリンクを提供してくれませんか?私が見つけたのは この この などがありますが、包括的とは程遠いものです。HaskellWiki のものには、quot;use classes with care" や "defining symbolic infix identifiers should be left to library writers only." といった gems" が含まれているのは言うまでもありません。

どのように解決するのですか?

本当に難しい質問です。 皆さんの回答から何か良いものが見つかると良いのですが。 一方、私が初心者のコードで見つけた間違いやその他の厄介なもののカタログを以下に示します。 Kornel Kisielewicz が指摘している Cal Tech のスタイル ページと重なる部分があります。 私のアドバイスのいくつかは、HaskellWiki の "gems" と同じくらい曖昧で役に立たないものですが、少なくともそれがより良いアドバイスであることを願っています :-) 。

  • 80 カラムに収まるようにコードをフォーマットしてください。 (上級者は 87 か 88 を好むかもしれませんが、それ以上は無理があります)。

  • を忘れないでください。 let バインディングと where 節は相互に再帰的な定義のネストを作成します。 ではなく a シーケンス という定義があります。

  • を利用する where 特に、すでにスコープ内にある関数のパラメータを見ることができる機能を活用しましょう(曖昧なアドバイスですが)。 もしあなたがHaskellを本当に理解しているなら、あなたのコードにはもっとたくさんの where -バインディングが let -バインディング あまりに多くの let -が多すぎるのは,MLプログラマやLispプログラマとして 再構築されていない証拠です.

  • 冗長な括弧は避ける 冗長な括弧が特に不快感を与える場所としては

    • の中で条件を囲む if 式で条件を囲む (再構築されていないCプログラマであることを示す)

    • それ自身が infix 演算子の引数である関数アプリケーションの周囲で ( 関数アプリケーションは、どのinfix演算子よりもタイトにバインドされます。 . この事実は、私たち恐竜が APL の右から左へのスキャン規則を焼き付けたのと同じように、すべての Haskeller の脳に焼き付けるべきものです)。

  • infix 演算子の周りにスペースを入れる。 タプルリテラルの各カンマの後に空白を入れます。

  • 関数とその引数の間に、たとえ引数が括弧で囲まれていたとしても、スペースを優先してください。

  • を使用する。 $ 演算子を上手に使って、括弧を減らしましょう。 とは密接な関係があるので、注意が必要です。 $ と接尾辞 . :

    f $ g $ h x == (f . g . h) x == f . g . h $ x
    
    
  • 内蔵の MaybeEither の型があります。

  • 絶対に書かない if <expression> then True else False と書いてはいけません。正しいフレーズは <expression> .

  • を使用しないでください。 head または tail というようにパターンマッチを使うことができます。

  • infix ドット演算子による関数合成を見落とさないようにしましょう。

  • 改行は慎重に使いましょう。 改行は読みやすさを向上させますが、トレードオフがあります:エディタは一度に40~50行しか表示しないかもしれません。大きな関数を一度に読んで理解する必要がある場合、改行を多用してはいけません。

  • をほとんど常に好みます。 -- というコメントよりも、行末まで続く {- ... -} コメントの上に行末まで続くコメントです。 中括弧付きのコメントは、大きなヘッダには適しているかもしれません。

  • 各トップレベル関数に明示的な型署名を与えます。

  • 可能であれば -- の行を = 記号、さらには隣接する行に出現する括弧やカンマも含まれます。

  • GHC centralに影響されて、私は非常に軽い嗜好を持っています。 camelCase を使い、エクスポートされた識別子には short_name をアンダースコアで囲み、ローカルな where -バウンドまたは let -bound 変数です。