Оператор Хаскелла (.) В реализации закона де Моргана

В этом вопросе автор написал реализацию законов де Моргана в Хаскеле. Я понимаю реализацию notAandnotB, а также notAornotB, но я изо всех сил пытаюсь понять реализацию notAorB который:

notAorB :: (Either a b -> c) -> (a -> c, b -> c)
notAorB f = (f . Left, f . Right)

Может ли кто-нибудь объяснить, как (f . Left, f . Right) часть работает? Я видел . оператор использовал раньше, но с тремя аргументами, а не с двумя.

Заранее спасибо.

1 ответ

Решение

Напомним, что определение . оператор (f . g) x = f (g x)т.е. f . g = \x -> f (g x) (синтаксически, это бинарный оператор, просто синтаксический сахар Haskell позволяет переопределить последнее определение как первое). Таким образом, определение у вас может быть перефразировано как

notAorB f = ((\x -> f (Left x)), (\y -> f (Right y)))

(это может быть сделано механически Lambdabot на #haskell, скажите ему @unpl ‹expr›) или более многословно

notAorB f = (lt, rt)
  where lt x = f (Left x)
        rt y = f (Right y)

Как всегда, попробуйте записать типы. Если (.) :: ∀ s t u. (t -> u) -> (s -> t) -> s -> u, f :: Either a b -> c, Left :: ∀ p q. p -> Either p q, затем f . Left или же (.) f Left :: a -> cи т. д.

Другие вопросы по тегам