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) }