在任何编程语言中 == 通过逻辑 OR 进行分发?( 我们可以把 (a==b || a==c) 写成 a==(b||c)

  • 本文关键字:我们 写成 编程语言 任何 OR operators
  • 更新时间 :
  • 英文 :


任何编程语言中是否有规定,我们可以将(a==b || a==c)编写为a==(b||c)

换句话说,在任何编程语言中,==分配是否比逻辑OR更可分配?(我们可以(a==b || a==c)写成a==(b||c)(。

几种语言都有类似的结构。IN在SQL中,in在python中,等等,大多数评估列表或数组。我知道的最接近的是哈斯克尔的or,它的类型是[Bool]-> Bool。

正如 Anton Gogolev 所说,很难为 b || c 找到一个好的类型,但并非完全不可能。

您可能需要定义高阶函数(|||) :: forall a . a -> a -> ((a -> Bool) -> Bool)实现为a (|||) b = f -> (f x) || (f y)(这里表示 lambda 表达式(。

现在您可以使用此(b ||| c) (== 42).

或者你可以做:

(|||) ::  forall a b . a -> a -> (a -> b -> Bool) -> b -> Bool
(|||) x y f b = (f x b) || (f y b)

现在你可以做( a ||| b ) (==) 42

当然,以上这些都不适用于缺乏高阶函数的语言。此外,平等(==(必须是函数而不是语言结构。(但是,你可以通过承诺获得类似的效果(。

也许上面的几行给出了为什么这种方法在野外不常用的提示。 :)a in [b,c]使用起来要简单得多。

编辑:(为了好玩(

您可以使用包装器类型来实现目标(在 Haskell 中(:

data F a = (Eq a) => Fn (a -> (a->a->Bool) -> Bool) | N a
(===) :: Eq a => F a -> F a -> Bool
(Fn f) === (N n) = f n (==)  
(N n) === (Fn f) = f n (==)  
(N a) === (N b) = a == b
(Fn a) === (Fn b) = error "not implemented"
(|||) :: Eq a => F a -> F a -> F a
N a ||| N b = Fn $ c f -> (a `f` c) || (b `f` c)
Fn a ||| N b = Fn $ c f -> a c f || ( b `f` c )
N a ||| Fn b = Fn $ c f -> b c f || ( a `f` c )
Fn a ||| Fn b = Fn $ c f -> (a c f) || (b c f)

现在我们的新 (===( 是分布在 (|||( 上。已经做出了一些努力来保持结合和交换属性。现在我们可以拥有以下所有内容:

N 1 === N 2
N 3 === ( N 3  |||  N 8  ||| N 5 )
( N 3  |||  N 8  ||| N 5 ) === N 0
N "bob" === ( N "pete" ||| N "cecil" ||| N "max")
N a === ( N 9 ||| N b ||| N c)

一切都会顺利进行。我们可以用基本类型替换标准运算符和类型 N 并编写 3 == (3 || 8 || 5(。你所要求的并非不可能。

该结构是通用的,您可以使用类似(>=) :: F a -> F a -> Bool的内容轻松扩展它,现在您可以使用( 100 || 3 || a || b ) >= c.(请注意,不使用任何列表或数组。

最新更新