演算子を引数に渡す
最近haskellの勉強を始めて、演算子(<5)や(==5)などを引数で渡すことができることを知りました。
僕が今までに使用したことがあるpython,rust,c/c++,phpでは使ったことがなかったので、、、
他に演算子を引数として渡せる言語ってありますか???
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答3件
1
ベストアンサー
pythonです
演算子(<5)や(==5)などを引数で渡す
の実現には、いくつかの機能が必要で、「関数が第一級オブジェクト」であることと「部分適用」が可能なことです。
関数が第一級オブジェクトであれば、高階関数が使えて、「==5」を関数に渡すことができるようになります。 pythonも関数が第一級オブジェクトなのでこれは可能です。
また、「==5」というのは、 本来引数が2つ必要な「==」演算に足して、1つだけ引数を与えたものです。haskelでは引数が足りない場合、その関数呼び出しは、残りの引数を取る関数を返します。
「==5」は、引数が1つたりないので、「引数を1つ取りそれを5と比べて結果を返す関数」を表します。
これが部分適用です。 haskelでは、言語機能として実装さえれているので自然に書けますが、pythonでは functoolsモジュールのpartial関数を使って実現します。
pythonで「==5」を作るにはこんな観じです。
iseql5 がそれです。
python
1import operator 2import functools 3 4is_eql5 = functools.partial(operator.eq, 5) 5 6print(is_eql5(5)) 7print(is_eql5(10))
pythonにある「==」演算子そのままでは部分適用できないので、同等の機能を持つ関数を提供するoperatarモジュールから採ってきています。
投稿2022/02/17 04:54
総合スコア12285
0
演算子自体を渡しているわけじゃないですが、
Ruby
1puts [1,2,3].inject(:+) 2#=> 36
とか、
Ruby
1def foo(op, x, y) 2 puts "#{x} #{op} #{y} = #{op.to_proc[x,y]}" 3end 4 5foo(:+, 1, 2) 6foo(:<, 3, 4) 7#=> 81 + 2 = 3 93 < 4 = true
とか。
投稿2022/02/17 01:24
総合スコア83680
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
0
演算子も関数の一種とみなすことができます。たとえば <5 なら
bool lessthan5(int x) { return x < 5; }
を定義すれば、 lessthan5(x) は x < 5 と同義です。
ならば関数の引数として関数を渡すことができれば、(直接ではないけれど)関数に演算子を渡すことができます。
C++
1#include <iostream> 2#include <functional> 3 4// f(x) が true なら "YES" と書く 5template<typename T> 6void yes_if(std::function<bool(T)> f, T x) { // 関数 yes_if に 関数(オブジェクト) f を渡す 7 if ( f(x) ) std::cout << "YES\n"; 8} 9 10int main() { 11 std::function<bool(int)> lessthan5 = [](int x) { return x < 5; }; // 関数オブジェクト 12 yes_if(lessthan5, 3); 13}
投稿2022/02/16 22:25
総合スコア16610
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
同じタグがついた質問を見る
Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。
Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。
Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。