Оператор Хаскелла (.) В реализации закона де Моргана
В этом вопросе автор написал реализацию законов де Моргана в Хаскеле. Я понимаю реализацию 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
и т. д.