3

たとえば、私は次のように書きます。

x = 2
y = x + 4
print(y)
x = 5
print(y)

そしてそれは出力します:

6 (=2+4)
9 (=5+4)

また、これが実際に役立つ場合はありますか?

明確化:はい、ラムダなどがこの問題を解決します(これらは私がこのアイデアにたどり着いた方法でした)。これがデフォルトである特定の言語があるかどうか疑問に思いました。関数やラムダキーワードは必要ありません。

4

10 に答える 10

7

x基本的にすべてが関数ですが、変数は一度しかバインドされない (つまり、同じスコープで再割り当てできない) ため、Haskell は途中であなたに会います。

y = x + 4変数の割り当てを考えるのは簡単ですが、 y = map (+4) [1..](つまり、無限リストのすべての数字に 1 から 4 を追加することを意味します) を見ると、y今は何でしょう? 無限リストですか、それとも無限リストを返す関数ですか? (ヒント: 2 つ目です。) この場合、変数を関数として扱うことは、 lazinessを利用するときに、絶対に必要ではないにしても、非常に有益です。

実際、Haskell では、 の定義yは、引数を受け入れずに を返す関数x+4xあり、 も引数をとらず、値 2 を返す関数です。


一次関数を使用する言語では、無名関数を変数に割り当てるのは簡単ですが、ほとんどの言語では、関数呼び出しを示すために括弧を追加する必要があります。

Lua コードの例:

x = function() return 2 end
y = function() return x() + 4 end
print(y())
x = function() return 5 end
print(y())
$ lua x.lua
6
9

または、Python で同じこと (一次関数に固執しますが、単純な整数を に使用することもできますx):

x = lambda: 2

y = lambda: x() + 4

print(y())

x = lambda: 5

print(y())
$ python x.py
6
9
于 2009-10-07T02:21:03.717 に答える
4

C#でfunc式を使用できます

Func<int, int> y = (x) => x + 5;
Console.WriteLine(y(5)); // 10
Console.WriteLine(y(3)); // 8

... また ...

int x = 0;
Func<int> y = () => x + 5;
x = 5;
Console.WriteLine(y()); // 10
x = 3;
Console.WriteLine(y()); // 8

...本当に機能的なスタイルでプログラムしたい場合は、最初のオプションがおそらく最適です。

  1. それはあなたが数学の授業で見たもののように見えます。
  2. 外部状態について心配する必要はありません。
于 2009-10-07T02:19:09.647 に答える
2

F#、Haskell、Scalaなどのさまざまな関数型言語をチェックしてください。Scalaは関数をapply()メソッドを持つオブジェクトとして扱い、他の種類のオブジェクトと同じように、関数を変数に格納して渡すことができます。ただし、Scala関数の定義をコードとして出力できるかどうかはわかりません。

更新:少なくともいくつかのLispでは、関数をコードとしてきれいに印刷できることを思い出しているようです(たとえば、Schemeのきれいな印刷関数)。

于 2009-10-07T02:06:54.180 に答える
1

プログラミング言語Lucidはこれを行いますが、関数ではなく呼び出しxと「ストリーム」を行います。yプログラムは次のように記述されます。

y
  where
    y = x + 4
  end

そして、次のように入力します。

 x(0): 2
   y = 6
 x(1): 5
   y = 7

もちろん、Lucid は (ほとんどの興味深いプログラミング言語と同様に) あまり知られていないため、誰も見つけられなかったとしても不思議ではありません。(またはそれを探した)

于 2009-10-27T02:29:45.700 に答える
1

これがスプレッドシートの仕組みです。

また、関数の引数を評価するための名前セマンティクスによる呼び出しにも関連しています。Algol 60 にはそれがありましたが、実装が複雑すぎて普及しませんでした。

于 2009-10-07T06:38:07.683 に答える
0

関数型プログラミング言語については、ここWikipediaでF#をチェックしてみてください。

私自身はOOPに集中して以来、これらのタイプの言語にまだ取り組んでいませんが、F#がリリースされたらすぐに掘り下げていきます。

お役に立てれば!

于 2009-10-07T02:09:30.213 に答える
0

これらの中で私が見た中で最も近いものは、チャートコンポーネントのテクニカル分析システムの一部です。(トレードス​​テーション、メタストックなど)が、主にメタデータの複数のセット(購入/販売シグナルなど)を返すことに重点を置いており、メタデータまたは財務データを受け入れるか、直接プロットする他の関数にフィードできます。

私の2c:あなたが提案する言語は、控えめに言っても非常に混乱するでしょう。関数は通常、正当な理由でr値です。このコード(javascript)は、r値として機能を強制することで読みやすさ(したがってメンテナンス)がn倍に向上することを示しています。

var x = 2;
var y = function() { return x+2; }
alert(y());
x= 5;
alert(y());
于 2009-10-07T02:12:35.777 に答える
0

Selfはフィールドとメソッドを区別しません。どちらもスロットであり、まったく同じ方法でアクセスできます。スロットには値または関数を含めることができます (したがって、これら 2 つは依然として別個のエンティティです) が、その区別はスロットのユーザーには関係ありません。

于 2009-10-07T11:36:31.963 に答える
0

Scala では、関数に遅延値と名前による呼び出し引数があります。

def foo(x : => Int) {
    println(x)
    println(x) // x is evaluated again!
}

何らかの方法で、これはあなたが探していた効果を持つことができます。

于 2009-10-07T11:38:59.203 に答える
-1

OctaveRMaximaなどの数学指向の言語がそれを行うと私は信じています。私は間違っているかもしれませんが、他の誰もそれらについて言及していないので、そうすると思いました.

于 2009-10-07T12:03:16.637 に答える