web-dev-qa-db-ja.com

名前付き関数を定義するための重複した構文は、言語設計の悪い決定ですか?

私は楽しみのためにプログラミング言語をモデリングしており、構文はScala-特に関数定義に大きく影響されます。

私の言語def構文(クラスメソッド)を介して定義された関数と値に割り当てられた匿名関数(を使用して作成された)を区別しないため、設計上の問題が発生しました=>)- implementationbehaviour の両方の違いを取り除きます。

その結果、次の2つの定義は同じ意味になります。

def square(x: Int) = x*x

val square = (x: Int) => x*x

後者の形式(即時の無名関数の割り当て)が通常の状況で使用される理由はありません。def形式の代わりにそれを使用するのは、単に可能です。

名前付き関数を定義するためのそのような重複した構文があると、言語の直交性やその他の設計上の側面が損なわれますか?

defを介して)メソッドと名前付き関数の短くて直感的な定義、および(=>を使用して)匿名関数の短い定義を可能にするため、私はこのソリューションを好みます。

編集:Scaladoes2つの違い-無名関数は、defで定義されたメソッドと同じではありませんScalaで。ただし、違いは比較的微妙です。以前にリンクした投稿を参照してください。

9
jcora

同じことを意味するが異​​なるように見える2つの構成体を持つことは、言語では絶対に最小限に抑える必要があると思います。重複があると、言語の読み取り(つまり、でのコードの書き込み/変更)の困難さが増します。 allの排除は、任意の構成体(たとえば、反復と再帰の同等性)を作成できる言語では避けられません。

したがって、この場合は、ここで設計を改善できると思います。関数を定義する単一の方法は、私にとって最も理にかなっています。この場合、実際に実行している2つのscalaステートメントは少し異なる意味合いを持っているように思われますが、これもおそらく良い設計ではありません(おそらく、次のような違いを明記したものを持つことが最善です)キーワード)。

実際、この原則は名前付き関数だけでなく、any関数にも適用できます。名前付き関数と無名関数の定義に違いがあるのはなぜですか? Lima では、関数は常に次のように定義されます:fn[<arguments>: <statements>]。 「名前を付けたい」場合は、変数に割り当てることができます:var x = fn[<arguments: <statements>]、そしてそれを匿名で別の関数に渡したい場合:function[fn[<arguments: <statements>]]。巻き上げたい場合は、定数const var x = fn[<arguments: <statements>]。単一のフォームは、それらが同じことを意味することを明らかにします。

3
B T

Scala-ラムダとdefメソッドの基本的な違いを発見しました-実装するかどうかはまだわかりません。それについてさらに調査する必要があり、その後、私の決定について報告します。

基本的に、メソッドのみがreturnを実行できます。また、キーワードがラムダから使用される場合、実際にはそれを含むメソッドから戻ります。

私が言ったように、私はこれが欲しいかどうかわかりません。しかし、この構文には十分な正当化である可能性があります。または、微妙な違いが予期せず害を及ぼす可能性があるため、危険すぎる可能性があります。

詳細

2
jcora

あなたが投稿したものは有効ですscalaで問題なく動作します。

2倍化によってscala(私の知る限り))の問題が発生していないことを考えると、それはあなたの言語でも問題にならないと言います。

2
Daenyth