web-dev-qa-db-ja.com

ユーザーが使用/回避する必要があるHaskell(GHC)拡張機能はどれですか?

私はGHCに拡張機能を使用するように言われた経験を数回経験しましたが、その拡張機能を使用すると、単純なリファクタリングでHaskell 98(現在は 201 )そしてより簡単な解決策があります。

一方、GADTまたはRank2Types(まれにRankNTypes)を使用すると、作業量が大幅に減り、コードがよりクリーンになる場合もあります。

一般的に、より良い設計の可能性を曖昧にする傾向がある拡張機能と、それを改善する拡張機能はどれですか?両方を行うものがある場合、その拡張機能を使用することを決定する前に、ユーザーは何を探す必要がありますか(意図しているソリューションが正しいかどうかを確認してください)。

(参照 GHC Haskell拡張機能を使用する必要がありますか?

61
John F. Miller

道徳的に「良い」拡張と道徳的に「悪い」拡張のアドホックリスト-これは審美的な判断です!

良い

  • GADT
  • 並列リスト内包
  • パターンガード
  • モナド内包表記
  • タプルセクション
  • ワイルドカードを記録する
  • 空のデータ宣言
  • 実存的なタイプ
  • 一般化された新しいタイプの派生
  • MPTC + FD
  • 型族
  • 明示的な定量化
  • 上位のポリモーフィズム
  • 字句スコープのtyvar
  • バングパターン

悪い

  • SQL内包表記
  • 暗黙のパラメータ

醜い(しかし必要)

  • テンプレートHaskell
  • 箱から出されたタイプとタプル
  • 決定不可能で、重複し、一貫性のないインスタンス-通常、設計ミスがあることを意味します。

わからない

  • 矢印表記
  • パターンを表示
53
Don Stewart