Haskell 无效函数

Haskell void function

我是 Haskell 的新手。在 Monad 文档中,有一个使用 void 函数的示例:

>>> void (Left 8675309)
Left 8675309
>>> void (Right 8675309)
Right ()

我很难弄清楚为什么会这样。

我看到 void 定义为:void x = () <$ x(<$) = fmap . const 但我不明白为什么 Left 和 Right 之间存在差异。

有什么提示吗?

因为 fmap 映射 Right 中定义的值,而不是 Left 中定义的值。实际上,Either 定义为:

data Either a b = Left a | Right b

Either aFunctor 因此实现为:

instance Functor (Either a) where
    fmap _ (Left x) = Left x
    fmap f (Right x) = Right (f x)

这是有道理的,因为 Functor 需要一种类型 * -> *,因此 fmap :: Functor f => (b -> c) -> f b -> f cEither 映射了 fmap :: (b -> c) -> Either a b -> Either a c .

由于 void 被定义为 void = fmap (const ()),这意味着如果我们对每个案例进行分析,我们会看到:

fmap (const ()) (Left x) = Left x
fmap (const ()) (Right x) = Right (const () x) = Right ()