확장 NullaryTypeClasses (지금은 MultiParamTypeClasses에 합쳐졌습니다.)

Posted on July 11, 2020

타입 매개 변수가 하나도 없는 타입 클래스를 만들려면 필요한 확장입니다.

함수 컨텍스트에 클래스를 걸어두고, 함수에서 클래스에 있는 메소드를 사용하면 실제 메소드 구현체는 나중에 결정됩니다. 여러 개의 인스턴스 중 고르기 위한게 아니라, 선언과 정의를 분리하는 용도로 타입 클래스 + 인스턴스를 사용합니다. 분리 용도로만 쓰니 인스턴스를 여러 개 만들 필요가 없습니다. 인스턴스를 여러 개 만들 때는 타입 매개 변수에 따라 여러 개의 인스턴스들을 만들게 되는데, 매개 변수가 없기 때문에 인스턴스를 여러 개 만들 수 없고, 단 하나만 만들 수 있습니다.

라이브러리 코드가 아래와 같다면

{-# LANGUAGE NullaryTypeClasses #-}
-- 이렇게 클래스를 만들어서 logMessage란 메소드를 선언해서
class Logger where
  logMessage :: String -> IO ()

-- 라이브러리 함수에서 사용합니다.
someLibFunc :: Logger => IO ()
someLibFunc = do
    ...
    logMessage "Some Log"
    ...

그럼 실제 logMessage의 구현체는 라이브러리를 쓰는 사용자가 다음처럼 인스턴스를 만들어 지정해 줄 수 있습니다.

instance Logger where
    logMessage t = putStrLn t

라이브러리에 매개 변수가 하나도 없는 클래스가 보이면, 함수를 선언만해서 미리 쓸테니, 실제 구현체는 사용자가 입 맛에 맞는 인스턴스를 만들어 넘기라는 얘기입니다.

참고
GHC User Guide - 6.8.6. Nullary type classes 24 Days of GHC Extensions: Nullary Type Classes

Github 계정이 없는 분은 메일로 보내주세요. lionhairdino at gmail.com