私は楽しみのためにプログラミング言語をモデリングしており、構文はScala-特に関数定義に大きく影響されます。
私の言語がdef
構文(クラスメソッド)を介して定義された関数と値に割り当てられた匿名関数(を使用して作成された)を区別しないため、設計上の問題が発生しました=>
)- implementation と behaviour の両方の違いを取り除きます。
その結果、次の2つの定義は同じ意味になります。
def square(x: Int) = x*x
val square = (x: Int) => x*x
後者の形式(即時の無名関数の割り当て)が通常の状況で使用される理由はありません。def
形式の代わりにそれを使用するのは、単に可能です。
名前付き関数を定義するためのそのような重複した構文があると、言語の直交性やその他の設計上の側面が損なわれますか?
(def
を介して)メソッドと名前付き関数の短くて直感的な定義、および(=>
を使用して)匿名関数の短い定義を可能にするため、私はこのソリューションを好みます。
編集:Scaladoes2つの違い-無名関数は、def
で定義されたメソッドと同じではありませんScalaで。ただし、違いは比較的微妙です。以前にリンクした投稿を参照してください。
同じことを意味するが異なるように見える2つの構成体を持つことは、言語では絶対に最小限に抑える必要があると思います。重複があると、言語の読み取り(つまり、でのコードの書き込み/変更)の困難さが増します。 allの排除は、任意の構成体(たとえば、反復と再帰の同等性)を作成できる言語では避けられません。
したがって、この場合は、ここで設計を改善できると思います。関数を定義する単一の方法は、私にとって最も理にかなっています。この場合、実際に実行している2つのscalaステートメントは少し異なる意味合いを持っているように思われますが、これもおそらく良い設計ではありません(おそらく、次のような違いを明記したものを持つことが最善です)キーワード)。
実際、この原則は名前付き関数だけでなく、any関数にも適用できます。名前付き関数と無名関数の定義に違いがあるのはなぜですか? Lima では、関数は常に次のように定義されます:fn[<arguments>: <statements>]
。 「名前を付けたい」場合は、変数に割り当てることができます:var x = fn[<arguments: <statements>]
、そしてそれを匿名で別の関数に渡したい場合:function[fn[<arguments: <statements>]]
。巻き上げたい場合は、定数const var x = fn[<arguments: <statements>]
。単一のフォームは、それらが同じことを意味することを明らかにします。
Scala-ラムダとdef
メソッドの基本的な違いを発見しました-実装するかどうかはまだわかりません。それについてさらに調査する必要があり、その後、私の決定について報告します。
基本的に、メソッドのみがreturn
を実行できます。また、キーワードがラムダから使用される場合、実際にはそれを含むメソッドから戻ります。
私が言ったように、私はこれが欲しいかどうかわかりません。しかし、この構文には十分な正当化である可能性があります。または、微妙な違いが予期せず害を及ぼす可能性があるため、危険すぎる可能性があります。
あなたが投稿したものは有効ですscalaで問題なく動作します。
2倍化によってscala(私の知る限り))の問題が発生していないことを考えると、それはあなたの言語でも問題にならないと言います。