명명 된 함수를 정의하기위한 중복 구문이 잘못된 언어 설계 결정입니까?


9

나는 재미를 위해 프로그래밍 언어를 모델링하고 있으며 구문은 스칼라, 특히 함수 정의에 크게 영향을받습니다.

언어 def 구문 (클래스 메서드)을 통해 정의 된 함수 와 값에 할당 된 익명 함수 (을 사용하여 생성) 를 구분하지 않기 때문에 설계 문제가 발생했습니다 . 구현동작=> 의 차이를 제거합니다 .

결과는 다음 두 가지 정의가 같은 의미입니다.

def square(x: Int) = x*x

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

어떤 정상적인 상황에서 사용되는 후자의 형태에 대한 이유 (즉시 익명 함수 할당은) 없다 - 단순히의 의 대신 사용하는 def형태.

명명 된 함수를 정의하기 위해 이러한 중복 구문을 사용하면 언어의 직교성 또는 다른 디자인 측면이 손상됩니까?

이 솔루션을 사용하면 메소드와 명명 된 함수 ( def) 를 짧고 직관적으로 정의하고 익명 함수 ()를 짧게 정의 할 수 있으므로이 솔루션을 선호합니다 =>.

편집 : 스칼라 두 가지를 구별합니다 -익명 함수는 def스칼라에서 정의한 메소드와 다릅니다 . 차이점은 비교적 미묘합니다. 전에 링크 한 게시물을 참조하십시오.


However, assigning existing functions문장의 끝을 놓친 것 같습니다
이즈 카타

1
val표기법을 사용하여 재귀 함수를 정의 할 수 있습니까 ?
조르지오

2
나는 이것이 Scala에서도 가능하다는 것을 확인했다. SML에서는 그렇지 않으며 fun재귀 함수를 정의하는 데 사용해야 합니다.
조르지오

3
두 번째 형태는 실제로 특별한 구문 구조가 아닙니다 def. 익명 함수, 예 (x : Int) => x + 1를 들어 객체이며 객체를로 값에 할당 할 수 있다는 사실의 부작용 일뿐 입니다 val f = .... 언어 디자이너는 구문을 허용하지 않기 위해 길떠나야했을 것입니다 . 똑같은 일을하는 두 가지 다른 구문을 지원하려는 노력을 명시 적으로하는 것과는 완전히 다릅니다.
KChaloux

3
언어로 하나의 방법보다 더 많은 일을하고의 주요 장점은 (여기에 생각의 C ++) 실제 문제에서 어떤 방해 비생산적인 종교 논쟁을 시작하는 좋은 방법 .......입니다
mattnz

답변:


3

나는 같은 것을 의미하지만 다르게 보이는 두 가지 구조를 갖는 것은 언어에서 절대적으로 최소한으로 유지되어야한다고 생각합니다. 중복은 언어를 읽기 (따라서 코드를 작성 / 수정하기)가 더 어려워집니다. 임의의 구성을 만들 수있는 언어 (예 : 반복과 재귀의 동등성)에서는 모든 중복을 제거 수 없습니다.

따라서이 경우에는 더 잘 설계 될 수 있다고 생각합니다. 함수를 정의하는 단일 방법이 가장 적합합니다. 이 경우 실제로 두 스칼라 문장이 약간 다른 의미를 갖는 것처럼 들리 며, 이는 아마도 좋은 디자인이 아닐 수도 있습니다 (키워드와 같은 차이점을 명확하게 나타내는 것이 가장 좋습니다).

실제로이 원칙을 명명 된 함수뿐만 아니라 모든 함수 에도 적용 할 수 있습니다 . 명명 된 함수와 익명 함수를 정의하는 데 왜 차이가 있습니까? 에서 리마 , 함수는 항상 다음과 같이 정의됩니다 fn[<arguments>: <statements>]. "이름을 지정"하려면 변수에 변수를 할당하고 var x = fn[<arguments: <statements>]다른 함수에 익명으로 전달하려면 다음을 수행하십시오 function[fn[<arguments: <statements>]]. 게양을 원하면 일정하게 만드십시오 const var x = fn[<arguments: <statements>]. 단일 형태는 그들이 동일한 것을 의미한다는 것을 분명히합니다.


const게양 을 유발 하는 것은 매우 흥미롭지 만 완벽합니다. JS에서는 function myFunc게양이 발생하지만 var myFunc =그렇지 않은 경우가 있습니다.
mpen

1
@mpen 그래, 실제로 자바 스크립트는 본질적으로 같은 일을한다. function fnName()...형태는 사실 그것과 올바른 일을 게양 만드는 것입니다 상수를 생성 않습니다. Javascript는 폼을 사용할 때 var fn = function anotherFnName()...이름 anotherFnName 호이스트 되지 않고 명확하게 일정하기 때문에 상황을 혼란스럽게 만듭니다 .
BT

2

게시 한 것은 유효한 스칼라이며 정상적으로 작동합니다.

두배로 인해 scala (내 지식으로) 문제가 발생하지 않았으므로 언어에 문제가되지 않을 것이라고 말하고 싶습니다.


1
스칼라에서 유효하지만 대부분 동일하게 작동하지만 동일한 것을 의미하지는 않습니다. 더 복잡한 예제를 만들 경우 (예 : 익명 함수에는 유형 다형성을 사용할 수 없음) 차이가 더 분명해집니다.
jcora

2

def스칼라에서 람다와 메소드 의 근본적인 차이점을 발견했습니다 . 구현 여부를 여전히 확신하지 못합니다. 나는 그것에 대해 더 많은 연구를해야하고 내 결정에 대해 다시보고 할 것이다.

본질적으로 메소드 만 가능 return하며 키워드가 람다에서 사용되면 실제로는 포함 메소드에서 반환됩니다.

내가 말했듯이, 나는 이것을 원하는지 확실하지 않습니다. 그러나이 구문에는 충분할 수 있습니다. 미묘한 차이로 인해 예기치 않게 해를 입을 수 있으므로 너무 위험 할 수 있습니다.

세부

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.