확장 RecursiveDo

Posted on October 7, 2023

Using GHC - 6.2.3. The recursive do-notation Haskell 98의 do표기notation는 재귀적 바인딩을 허용하지 않습니다.

justOnes = do { xs <- Just (1:xs)
              ; return (map negate xs) }

xs는 재귀적으로 바인딩되고 있습니다. 아마 가능했다면 [1,1,...]negate[-1,-1,...]이 될 겁니다.

effect를 적절히 처리하며 재귀하려면 MonadFix 클래스의 mfix 메소드가 있어야 합니다. Maybe, [], ST, IO 등의 모나드는 MonadFix 인스턴스 구현을 이미 가지고 있습니다.

MonadFix 글을 확인하세요.

{-# LANGUAGE RecursiveDo #-}
justOnes = mdo { xs <- Just (1:xs)
               ; return (map negate xs) }
ghci> take 10 <$> justOnes
Just [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]

RecursiveDo 확장이 제공하는 또 다른 키워드 rec를 써서 표현할 수 있습니다.

justOnes = do { rec { xs <- Just (1:xs) }
              ; return (map negate xs) }
Github 계정이 없는 분은 메일로 보내주세요. lionhairdino at gmail.com