質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1590閲覧

演算子を引数として渡す

qwerting

総合スコア1

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2022/02/16 14:38

演算子を引数に渡す

最近haskellの勉強を始めて、演算子(<5)や(==5)などを引数で渡すことができることを知りました。

僕が今までに使用したことがあるpython,rust,c/c++,phpでは使ったことがなかったので、、、
他に演算子を引数として渡せる言語ってありますか???

Bearded-Ockham👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問