演算子を引数に渡す
最近haskellの勉強を始めて、演算子(<5)や(==5)などを引数で渡すことができることを知りました。
僕が今までに使用したことがあるpython,rust,c/c++,phpでは使ったことがなかったので、、、
他に演算子を引数として渡せる言語ってありますか???
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
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
総合スコア13847
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
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。