2017-01-14 82 views
2

this question中,作者在Haskell中編寫了de Morgan原則的實現。我理解的notAandnotB,並notAornotB的實現,但我努力理解的notAorB執行當中是:德摩根法律實施中的Haskell點(。)算子

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 -> uf :: Either a b -> cLeft :: ∀ p q. p -> Either p q,然後f . Left(.) f Left :: a -> c

+0

完美;感謝您的幫助! – helencrump