2017-01-14 10 views
2

В this question автор написал реализацию законов Моргана в Хаскелле. Я понимаю реализацию notAandnotB и notAornotB, но я изо всех сил, чтобы понять реализацию notAorB, которая:Haskell dot (.) Оператор в реализации закона Моргана

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

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

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

ответ

3

Напомнит, что определение оператора . является (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, и т.д.

+0

Совершенный; спасибо за помощь! – helencrump