Haskell пустая функция - PullRequest
       34

Haskell пустая функция

5 голосов
/ 16 марта 2020

Я новичок в Haskell. В документации Monad есть пример использования функции void:

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

Мне трудно понять, почему это так.

Я вижу, что пустота определяется как: void x = () <$ x и (<$) = fmap . const, но я не могу понять, почему существует разница между левым и правым.

Любые подсказки?

1 Ответ

5 голосов
/ 16 марта 2020

Поскольку fmap отображает значение, определенное в Right, а не в Left. Действительно, Either определяется как:

data Either a b = Left a | Right b

, и Functor из Either a, таким образом, реализуется как:

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 ()
...