2015-04-18 2 views
1

ifM реализуется как:Monadic if - как это работает?

ifM p t f = p >>= (\p' -> if p' then t else f) 

И еще одна функция while2 использует ifM как это,

while2 x y = ifM x (return()) $ ifM y (return()) $ while2 x y 

Мои вопросы:

  • IFM принимает три аргумента. Каковы их типы? (Я понял, как, р - функции предиката, T - истинный функциональный блок, F - ложь функционального блока)

  • В использовании ifM внутри while2, когда действительно происходит оценка аргумент ? Есть ли аргументы, поступающие после $ получить оценку первыми и их значения передаются в качестве аргументов while2

  • Что ifM сделать if не может сделать?

+0

'If' вы хотите узнать тип,' затем' загрузить свой код в GHCi! – AJFarmar

+0

Что работало во время компиляции с использованием ghc, не работало с GHCi .. код, который я обсуждаю, это @ http://porg.es/blog/simple-socket-programming-with-haskell –

+2

'ifM' загружен отлично:' ifM :: Monad m => m Bool -> ma -> ma -> ma'. – AJFarmar

ответ

5

Это 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 
Смежные вопросы