갈루아의 반서재

728x90

GHC extension은 적어도 3가지 방법으로 단독 또는 결합하여 사용가능합니다. ExtensionName 이라고 불리는 가상의 extension에 대해 알아봅니다. 


LANGUAGE Pragma

개별 파일에 대해서는 파일 상단에 {-# LANGUAGE ExtensionName #-} 라는 형식으로 사용이 가능합니다 (module 헤더 이전, 또는 첫 번째 import 이전 및  module 헤더가 없다면 definition 이전에 위치).


여러 개의 LANGUAGE pragmas 를 사용함으로써 여러개의 extension 도 사용가능합니다. 예를 들면, ScopedTypeVariablesLiberalTypeSynonyms, 와 MultiWayIf 라는 3개의 extension 을 사용하려면 다음의 3가지 방식 모두 똑같은 결과를 보입니다.

{-# LANGUAGE ScopedTypeVariables, LiberalTypeSynonyms, MultiWayIf #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE LiberalTypeSynonyms #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE ScopedTypeVariables, LiberalTypeSynonyms #-}
{-# LANGUAGE MultiWayIf #-}


.cabal File

cabal 과 stack 으로 관리되는 프로젝트라면, .cabal 파일에 추가함으로써 전체 프로젝트에 영향을 미칠 수 있습니다.  

.cabal 파일의 library 와/또는 executable 섹션에  extensions: ExtensionName 을 추가합니다.

extensions: 라인에 콤마, 공백, 또는 새줄 구분하여 복수의 extension 네임을 위치시킴으로써 여러개의 extensions 활용도 가능합니다.


-X Options

REPL 세션 등에서는 플래그 -XExtensionName 이라는 형식으로  ghc, ghci, 또는 runghc 명령라인을 전달함으로써 사용가능합니다. 복수의 -X 플래그를 전달함으로써 복수의 extension 사용도 가능합니다. 


https://www.schoolofhaskell.com/school/to-infinity-and-beyond/pick-of-the-week/guide-to-ghc-extensions/how-to-enable-extensions




728x90