Это type является:
ifM :: Monad m => m Bool -> m a -> m a -> m a
Чтобы увидеть, как это работает, вы можете просто проверить его в ghci
и выяснить это поведение:
λ> ifM (return True) (print "true") (print "false")
"true"
λ> ifM (return False) (print "true") (print "false")
"false"
Так на основе результата первого монадического булева параметра, выполняется одно из монадических выражений. Он отличается от обычного if
тем, как он принимает монадические значения.
while2 имеет этот тип подписи:
while2 :: Monad m => m Bool -> m Bool -> m()
Вы можете получить представление о том, как она работает, видя этот пример:
λ> while2 (print "hello" >> return True) (return True)
"hello"
λ> while2 (print "hello" >> return True) (print "bye" >> return True)
"hello"
λ> while2 (print "hello" >> return False) (print "bye" >> return True)
"hello"
"bye"
Таким образом, в while2
функции, то первое монадическое значение выполняется. Если он Sevaluates до True
, то return()
выполнен. Если это неверно, тогда ifM y (return()) $ while2 x y
выполнен с теми же правилами ifM
. Теперь, если y
вычисляется в False
, то while2
снова оцениваются в рекурсивном способе приводят к бесконечному циклу:
λ> while2 (print "hello" >> return False) (print "bye" >> return False)
"hello"
"bye"
"hello"
"bye"
"hello"
"bye"
"hello"
"bye"
C-c
'If' вы хотите узнать тип,' затем' загрузить свой код в GHCi! – AJFarmar
Что работало во время компиляции с использованием ghc, не работало с GHCi .. код, который я обсуждаю, это @ http://porg.es/blog/simple-socket-programming-with-haskell –
'ifM' загружен отлично:' ifM :: Monad m => m Bool -> ma -> ma -> ma'. – AJFarmar