2017-08-08 150 views
11

「回報」應該在一些單子的背景下緊裹:爲什麼「return Nothing」不返回任何內容?

*Main> :i return 
class Applicative m => Monad (m :: * -> *) where 
    ... 
    return :: a -> m a 
    ... 
     -- Defined in ‘GHC.Base’ 

如果我問GHCI什麼「返回Nothing」的類型,它符合是:

*Main> :t return Nothing 
return Nothing :: Monad m => m (Maybe a) 

但如果我評價它,我看不出有任何外單子,只是內可能:

*Main> return Nothing 
Nothing 
+11

GHCI默認爲IO單子,如果你不指定一個。它只是打印一個'IO(也許a)' – 4castle

+7

@ 4castle的內容輕微地誤導shachaf:'IO(也許a)'包含一個'Maybe a',就像'/ bin/ls'包含一個列表一樣的文件。這可能聽起來有些迂腐,但它不會打印'IO(也許a)'的內容。它運行一個'IO(也許a)',然後打印結果。區別可能很重要。 –

+1

@DavidYoung我個人覺得這個區別很重要,因爲IO monad的工作是瞭解價值的內部表現。出於推理的目的,我通常認爲所有單子都是容器(不管它們是否包含價值)。 – 4castle

回答

21

當GHCI付印的值,它會嘗試兩種不同的東西。首先,它嘗試將IO a的類型與a一致。如果可以,那麼它會執行IO操作並嘗試打印結果。如果它不能這樣做,它會嘗試打印給定的值。在你的情況下,Monad m => m (Maybe a)可以與IO (Maybe a)統一。

回顧這GHCI會議可能會幫助:

Prelude> return Nothing 
Nothing 
Prelude> return Nothing :: IO (Maybe a) 
Nothing 
Prelude> return Nothing :: Maybe (Maybe a) 
Just Nothing 
Prelude> Nothing 
Nothing 
相關問題