Всегда ли Хаскелл знает, какой «возврат» будет звонить?

Я определяю экземпляр монады следующим образом:

data Something = Something a

instance Monad Something where
    return a = Something a        --Wraps a in 'Something', correct?
    m >>= f = do
        var <- m
        return $ f var            --I want this to pass var to f, then wrap the result
                                  --back up in the 'Something' monad with the return I
                                  --Just defined

Вопросы ->

1: Есть ли явные ошибки / неправильные представления о том, что я делаю?

2: Уилл Хаскелл знает, как вызвать возвращение, которое я определил выше из m >>= f

3: Если я по какой-то причине определю другую функцию

f :: Something a -> Something b
f x = do
    var <- x
    return $ doMagicTo x

Будет return вызвать return, который я определил в экземпляре монады, и обернуть x в Something?

8
задан providence 20 October 2011 в 08:47
поделиться