2017-08-07 7 views
-2

(a==b || a==c)a==(b||c)と書くことができるようなプログラミング言語がありますか?は、任意のプログラミング言語で論理ORに分配されますか? (a == b || a == c)をa ==(b || c)と書くことができます

つまり、==は任意のプログラミング言語で論理ORに分配されていますか? ((a==b || a==c)a==(b||c)と書くことができます)。

+0

C、C++、またはJavaではありません。 b || cはどちらもブール型であることを意味します。私はこれが理にかなっているとは思わない。 – duffymo

+2

'b ||の型は何でしょうか? c'? –

+0

pythonの[nice in in syntax](https://stackoverflow.com/questions/12774279/how-to-check-if-a-variable-is-equal-to-one-string-or-another-string)を参照してください。 )。それはまったく異なっていますが、同様の効果があります(また、主流言語の同等のコードよりも十分に優れています)。 – hnefatl

答えて

1

いくつかの言語で同様の構成があります。 INはSQL、inはpythonなど、ほとんどの評価リストまたは配列です。私が知っている最も近いものは、[Bool] - > Bool型のHaskellのorです。

Anton Gogolevが言っていたように、b ||の良いタイプを見つけるのは難しいです。 c、完全に不可能ではない。

高次関数(|||) :: forall a . a -> a -> ((a -> Bool) -> Bool)a (|||) b = \f -> (f x) || (f y)として実装する必要があります(ここでは\はラムダ式を意味します)。

ここでは、(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]ははるかに簡単です。

EDIT:(楽しい酒用)

あなたは(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を使用できます。 (リストや配列が使用されていないことに注意してください)

+0

詳細な回答ありがとうございます。私はあなたの意見を持っていると思う。 –

関連する問題