是= =在任何编程语言中对逻辑OR进行分配? (我们可以写(a == b || a == c)作为==(b || c))

时间:2017-08-07 12:36:09

标签: operators

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

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

1 个答案:

答案 0 :(得分:2)

有几种语言的类似结构。 SQL中为IN,python中为in等,大多数评估列表或数组。我所知道的最接近的是Haskell的or,其类型为[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

当然,上述任何一种都不适用于缺乏高阶函数的语言。而且,平等(==)必须是功能而不是语言结构。 (但是你可以用Promises获得类似的效果)。

也许以上几行提示为什么这种方法在野外并不常用。 :) 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。 (请注意,没有使用列表或数组。)