Я изучаю do expression
и Monad
, используя УЧИТЬ ВАС ХАСКЕЛЛ ДЛЯ БОЛЬШОГО ХОРОШЕГО. Там реализация gcd
с использованием функции tell
меня смущает.
gcd :: Int -> Int -> Writer [String] Int
gcd a b
| b == 0 = tell ["Finished with " ++ show a ] >>= (\_ -> return a)
| otherwise = tell [show a ++ " mod " ++ show b ++ " = " ++ show (a `mod` b)] >>= (\_ -> gcd b (a `mod` b))
gcdResult = gcd 8 3
-- result: WriterT (Identity (1,["8 mod 3 = 2","3 mod 2 = 1","2 mod 1 = 0","Finished with 1"]))
Но меня смущает функция tell
. При использовании >>= (\_ -> ...)
или >>
результат до этого будет проигнорирован, так почему результат результата tell
может быть передан окончательному результату? По моей мысли, результат tell
может быть проигнорирован, а конечным результатом будет WriterT (Identity (1,[]))
.