德摩根定律实现中的 Haskell 点 (.) 运算符

标签 haskell demorgans-law dot-operator

this question ,作者用 Haskell 编写了德摩根定律的实现。我了解 notAandnotBnotAornotB 的实现,但我很难理解 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) (从语法上讲,它是一个二元运算符,只是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)

一如既往,尝试写下类型。 If (.)::∀ s t u。 (t -> u) -> (s -> t) -> s -> u, f::要么 a b -> c, Left::∀ p q 。 p -> 或者 p q,然后 f 。 Left(.) f Left::a -> c

关于德摩根定律实现中的 Haskell 点 (.) 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41652495/

相关文章:

Haskell sequencelistIO [a -> IO a] -> a -> IO a

haskell - 为什么要为像 'nameless' 这样的 `(->) e` 类型定义一个仿函数实例

if-statement - 为什么一个变量与多个值的不相等检查总是返回 true?

c++ - 德摩根定律和 C++

java - 为什么不能取消引用 lambda 表达式?

c++ - 点运算符成本 c/c++

haskell - 为什么我找不到 NotQuiteCofree not-quite-comonad 的任何违法行为?

if-statement - 为什么一个变量与多个值的不相等检查总是返回 true?

haskell - 如何在 Haskell 中使用 (.)

linux - GHC:奇怪条件下的段错误