2017-02-10 11 views
4

Ниже приведен пример из Haskell tutorialДолжен ли связать результат с Монадой?

instance Monad Maybe where 
    return x = Just x 
    Nothing >>= f = Nothing 
    Just x >>= f = f x 
    fail _ = Nothing 

Однако, я смущен Just x... линии. Должен ли результат не быть монадой? Я бы ожидал, что линия будет

Just x >>= f = Just (f x) 
+6

Подсказка: какой тип 'f'? – duplode

+1

Чтобы добавить подсказку @ duplode, если '>> =' были реализованы так, как вы предлагаете, это ничем не отличается от 'flip fmap'. На самом деле это * точно * разница в мощности между '>> =' и 'fmap'. –

+0

Другими словами: 'f' уже позаботится об этом - он создает значение типа' Maybe b', то есть 'Just (y :: b)' или 'Nothing'. Если это не так, код не будет проверяться typecheck. –

ответ

9

Да! Вы правы в том, что результат был монадой, но помните тип оператора >>=: m a -> (a -> m b) -> m b. Затем мы предполагаем, что f имеет тип a -> m b, поэтому применение f к x возвращает монаду в результате.

+2

Добро пожаловать в StackOverflow! – Alec

 Смежные вопросы

  • Нет связанных вопросов^_^