2009년 8월 21일 금요일

haskell 확장 NamedFieldPuns ( record puns 라고 불리는듯 )

메뉴얼 참고.
이거 알아두면 편하겠군?


{-
# LANGUAGE NamedFieldPuns #-}

-- 이런 레코드 타입이 있다고 치자. 보통 함수에서는 모든 필드를 참조할
-- 필요가 없으니 패턴매칭으로 필요한 필드값만을 꺼내서 쓰는 식의 코딩이
-- 된다.
data C = C {
a :: Int,
b :: Int,
c :: Int
} deriving (Show)

-- 레코드 타입의 패턴매칭 기본 문법은 아래와 같다.
-- TypeName{fieldName=varName, ..}
f C{a=foo,b=bar} = (foo,bar)


-- 하지만 타이핑이 귀찮으니 보통 이런식으로 적을때 필드이름과
-- 변수이름을 같은 이름을 쓰는게 일반적.
g C{a=a, b=b} = (a,b)


-- NamedFieldPuns 확장을 쓴다면 필드이름과 변수이름이 같을경우 짧게
-- 타이핑하는게 가능해진다. 이런 확장을 record punning 이라고 칭하는
-- 모양이다.
h C{a,b} = (a,b)


-- puns 는 다른 패턴과 섞어쓰는것도 가능
i C{a, b=1} = 1
i C{a, b=2} = 2
i C{c} = c


-- 패턴매칭이 적용되는 다른부분(let등)에도 적용가능
j = let a = 1
b = 2
c = 3
in C {a,b,c}

댓글 없음: