2010-01-16 5 views
15

패턴 일치는 Haskell의 가장 우아한 기능 중 하나입니다.Haskell의 패턴 일치 Seq 's

저는 최근에 Data.Sequence를 사용하기 위해 대기열 데이터 구조가 필요한 프로젝트에서 작업 해 왔습니다.

floodFillWorker :: Image -> RGBAColor -> Double -> PixelQueue -> Image 
floodFillWorker image base tolerance queue 
    | Seq.null queue = image 
    | otherwise  = doSomeWork image 

나는 순서와 일치하는 패턴을 사용하거나 내가 가드를 사용해야하나요 : 나는 패턴 매칭의 우아함을 포기하고 경비에 의지해야처럼 그러나, 그것은 보인다?

답변

17

ephemient는보기 패턴으로 올바른 트랙에 있지만 실제로는 꽤 좋은 방법이라고 생각한다. Data.Sequence을 실제로 염두에두고 작성했으며 ViewL 또는 ViewR 유형 중 하나를 사용해야 데이터 구조를 패턴 매치 할 수 있습니다.

{-# LANGUAGE ViewPatterns #-} 

floodFillWorker image _ _ (Seq.viewl -> EmptyL) = image 
floodFillWorker image base tolerance queue = doSomeWork image 
+0

고마워요! 목록과 마찬가지로 앞면과 나머지 부분에도 패턴 일치를 사용할 수 있습니까? 예 : floodFillWorker _ _ _ (first : rest) = .... – Bill

+0

나는이를 지적하려고 생각했으나 OP가 실제로 여기의 시퀀스를 해체하기를 원하지 않는 것처럼 보였다. 그러나 그것이 효과가 있다면, 이것은 좋은 것입니다. – ephemient

+0

죄송합니다, 원래 질문은 절반으로 지정되었습니다. 명확히 해 주셔서 감사합니다! – Bill

6

은 가드 대신에 view patterns을 사용하지만 실제로는 더 좋지 않습니다 (IMO). 경비원들은 나에게 잘 어울린다.

{-# LANGUAGE ViewPatterns #-} 

floodFillWorker image _ _ (Seq.null -> True) = image 
floodFillWorker image base tolerance queue = doSomeWork image