言語拡張について
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
このように罠がある以上、多少冗長でも let
や where
を書こうと思いました。 詳細 (未確認)