타입 매개 변수가 하나도 없는 타입 클래스를 만들려면 필요한 확장입니다.
함수 컨텍스트에 클래스를 걸어두고, 함수에서 클래스에 있는 메소드를 사용하면 실제 메소드 구현체는 나중에 결정됩니다. 여러 개의 인스턴스 중 고르기 위한게 아니라, 선언과 정의를 분리하는 용도로 타입 클래스 + 인스턴스를 사용합니다. 분리 용도로만 쓰니 인스턴스를 여러 개 만들 필요가 없습니다. 인스턴스를 여러 개 만들 때는 타입 매개 변수에 따라 여러 개의 인스턴스들을 만들게 되는데, 매개 변수가 없기 때문에 인스턴스를 여러 개 만들 수 없고, 단 하나만 만들 수 있습니다.
라이브러리 코드가 아래와 같다면
{-# LANGUAGE NullaryTypeClasses #-}
-- 이렇게 클래스를 만들어서 logMessage란 메소드를 선언해서
class Logger where
logMessage :: String -> IO ()
-- 라이브러리 함수에서 사용합니다.
someLibFunc :: Logger => IO ()
= do
someLibFunc ...
"Some Log"
logMessage ...
그럼 실제 logMessage의 구현체는 라이브러리를 쓰는 사용자가 다음처럼 인스턴스를 만들어 지정해 줄 수 있습니다.
instance Logger where
= putStrLn t logMessage t
라이브러리에 매개 변수가 하나도 없는 클래스가 보이면, 함수를 선언만해서 미리 쓸테니, 실제 구현체는 사용자가 입 맛에 맞는 인스턴스를 만들어 넘기라는 얘기입니다.
참고
GHC User Guide - 6.8.6. Nullary type classes
24 Days of GHC Extensions: Nullary Type Classes