Using GHC - 6.2.3. The recursive do-notation
Haskell 98의 do
표기notation는 재귀적 바인딩을 허용하지 않습니다.
= do { xs <- Just (1:xs)
justOnes return (map negate xs) } ;
xs
는 재귀적으로 바인딩되고 있습니다. 아마 가능했다면 [1,1,...]
를 negate
한 [-1,-1,...]
이 될 겁니다.
effect를 적절히 처리하며 재귀하려면 MonadFix
클래스의 mfix
메소드가 있어야 합니다. Maybe
, []
, ST
, IO
등의 모나드는 MonadFix
인스턴스 구현을 이미 가지고 있습니다.
MonadFix 글을 확인하세요.
{-# LANGUAGE RecursiveDo #-}
= mdo { xs <- Just (1:xs)
justOnes return (map negate xs) } ;
ghci> take 10 <$> justOnes Just [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]
RecursiveDo
확장이 제공하는 또 다른 키워드 rec
를 써서 표현할 수 있습니다.
= do { rec { xs <- Just (1:xs) }
justOnes return (map negate xs) } ;