Ko/PatternSynonyms

From HaskellWiki
Jump to navigation Jump to search

PatternSynonyms는 GHC 확장이다.

아래와 같은 타입이 있을 때

data Type = App String [Type]

다음과 같이 패턴 매칭할 수 있다.

collectArgs :: Type -> [Type]
collectArgs (App "->" [t1, t2]) = t1 : collectArgs t2
collectArgs _ = []

이때 아래와 같이 패턴에 Arrow라는 이름을 지어주면

pattern Arrow t1 t2 <- App "->" [t1, t2]

다음과 같이 이름 Arrow를 이용해서 패턴 매칭할 수 있다.

collectArgs :: Type -> [Type]
collectArgs (Arrow t1 t2) = t1 : collectArgs t2

패턴 별명(Pattern Synonyms)을 지을 때 키워드 pattern<-를 사용했는데 <- 대신 =를 쓰면 다음과 같이 패턴 매칭 뿐만 아니라 표현식에서도 이름 Arrow를 사용할 수 있다.

pattern Arrow t1 t2 = App "->" [t1, t2]

arrows :: [Type] -> Type -> Type
arrows = flip $ foldr Arrow

아래 코드는 <-로 패턴 별명을 정의하는 건 가능하지만 =로 정의하는 것은 안 된다.

pattern ThirdElem x <- _:_:x:_
pattern Snd y <- (x, y)

참고