2017-08-08 97 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 
相关问题