Haskellの良いコーディング規約
質問
誰か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
-
内蔵の
Maybe
とEither
の型があります。 -
絶対に書かない
if <expression> then True else False
と書いてはいけません。正しいフレーズは<expression>
. -
を使用しないでください。
head
またはtail
というようにパターンマッチを使うことができます。 -
infix ドット演算子による関数合成を見落とさないようにしましょう。
-
改行は慎重に使いましょう。 改行は読みやすさを向上させますが、トレードオフがあります:エディタは一度に40~50行しか表示しないかもしれません。大きな関数を一度に読んで理解する必要がある場合、改行を多用してはいけません。
-
をほとんど常に好みます。
--
というコメントよりも、行末まで続く{- ... -}
コメントの上に行末まで続くコメントです。 中括弧付きのコメントは、大きなヘッダには適しているかもしれません。 -
各トップレベル関数に明示的な型署名を与えます。
-
可能であれば
--
の行を=
記号、さらには隣接する行に出現する括弧やカンマも含まれます。 -
GHC centralに影響されて、私は非常に軽い嗜好を持っています。
camelCase
を使い、エクスポートされた識別子にはshort_name
をアンダースコアで囲み、ローカルなwhere
-バウンドまたはlet
-bound 変数です。
関連
-
[解決済み] Project Eulerとの速度比較。CとPythonとErlangとHaskellの比較
-
[解決済み] 読んで学ぶべき良いHaskellのソース [終了しました]。
-
[解決済み】Haskellの入門編
-
[解決済み] Haskellの "Just "構文とは?
-
[解決済み] GHCでコンパイルした小さなHaskellプログラムを巨大なバイナリにする
-
[解決済み] Real World Haskellのどの部分が今となっては時代遅れ、あるいはバッドプラクティスと考えられているのでしょうか?
-
[解決済み] Data.Voidの不条理な関数って何に使うの?
-
[解決済み] キュアリングを利用するためのパラメータの順序付け
-
[解決済み] なぜStringを型クラスのインスタンスにできないのですか?
-
[解決済み] Cabal パッケージのあるバージョンをアンインストールするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】なぜパースエラーになるのか?インデント?
-
[解決済み】haskellでリストを逆順にする
-
[解決済み] 一般的に `{- |` で始まるHaskellのコメントは何を意味するのですか?
-
[解決済み] Haskellは実世界で何に使われているのか?[クローズド]
-
[解決済み] フリーモナドとは何ですか?
-
[解決済み] RustのtraitとHaskellのtypeclassの違いは何ですか?
-
[解決済み] Haskellにはなぜ "data "と "newtype "があるのですか?重複] [重複] [重複
-
[解決済み] GHCiの複数行コマンド
-
[解決済み] Haskellのmapにはfmapがあるのに、何の意味があるのだろう?
-
[解決済み] MonadPlus, Alternative, Monoidの型別は?