言語拡張について

TODO: GHC の言語拡張とは

書き方

フォーマッタ (ormolu) は言語拡張を 1 行ずつに分けてしまいますから、拡張の数だけ行を占領します:

{-# LANGUAGE BangPatterns #-}
{-# BlockArguments #-}
{-# LambdaCase #-}
{-# MultiWayIf #-}
{-# PatternGuards #-}
{-# TupleSections #-}
-- ..

言語拡張の宣言をフォーマッタの適用外にすれば、コード行数を削減することもできます:

{- ORMOLU_DISABLE -}
{-# LANGUAGE BangPatterns, BlockArguments, LambdaCase, MultiWayIf, PatternGuards, TupleSections #-}
{-# LANGUAGE NumDecimals, NumericUnderscores #-}
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, ScopedTypeVariables, TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{- ORMOLU_ENABLE -}

おすすめしない言語拡張

NPlusKPatterns

パタンを n + 定数 と書けるようにする拡張です。この拡張を有効にして ghci を起動してみます:

$ ghci -XNPlusKPatterns
Prelude> 

一見 N + K パタンは問題なく動きます:

Prelude> let (n + 1) = 1
Prelude> n
0

しかし n が負の数になるパタンでは実行時エラーが発生します:

Prelude> let (n + 1) = 0
Prelude> n
*** Exception: <interactive>:3:5-15: Non-exhaustive patterns in n+1

このように罠がある以上、多少冗長でも letwhere を書こうと思いました。 詳細 (未確認)