Ko/PatternSynonyms
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)