Haskell 德摩根定律实施中的点 (.) 运算符
Haskell dot (.) operator in de Morgan's law implementation
在 中,作者在 Haskell 中编写了德摩根定律的实现。我理解 notAandnotB
和 notAornotB
的实现,但我很难理解 notAorB
的实现,即:
notAorB :: (Either a b -> c) -> (a -> c, b -> c)
notAorB f = (f . Left, f . Right)
有人可以解释一下 (f . Left, f . Right)
部分是如何工作的吗?我以前见过 .
运算符,但有三个参数,而不是两个。
提前致谢。
回想一下 .
运算符的定义是 (f . g) x = f (g x)
, 即 f . g = \x -> f (g x)
(在句法上,它是一个 binary 运算符,只是 Haskell 的语法糖允许将后者定义重述为前者)。所以,你的定义可以改写为
notAorB f = ((\x -> f (Left x)), (\y -> f (Right y)))
(这可以由Lambdabot on #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
、等
在 notAandnotB
和 notAornotB
的实现,但我很难理解 notAorB
的实现,即:
notAorB :: (Either a b -> c) -> (a -> c, b -> c)
notAorB f = (f . Left, f . Right)
有人可以解释一下 (f . Left, f . Right)
部分是如何工作的吗?我以前见过 .
运算符,但有三个参数,而不是两个。
提前致谢。
回想一下 .
运算符的定义是 (f . g) x = f (g x)
, 即 f . g = \x -> f (g x)
(在句法上,它是一个 binary 运算符,只是 Haskell 的语法糖允许将后者定义重述为前者)。所以,你的定义可以改写为
notAorB f = ((\x -> f (Left x)), (\y -> f (Right y)))
(这可以由Lambdabot on #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
、等