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 a
的 Functor
因此实现为:
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 c
为 Either
映射了 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 ()
我是 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 a
的 Functor
因此实现为:
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 c
为 Either
映射了 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 ()