약간 주관적이지만 연산자를 사용하기 쉽고 명확하게 만드는 요소를 이해하기를 바랍니다. 나는 최근에 언어 디자인을 고려해 왔으며, 항상 돌아 다니는 한 가지 문제는 언어에서 핵심 조작을 연산자로 할 때와 키워드 또는 함수를 사용할 때입니다.
Haskell은 사용자 지정 연산자를 쉽게 만들 수 있고 종종 새 데이터 형식에 여러 연산자가 패키지되어 제공되기 때문에 다소 악명이 높습니다. 파섹 라이브러리는, 예를 들어, 같은 보석과 함께 파서를 결합하는 사업자의 톤과 함께 제공 >.
하고 .>
심지어 그들이 지금 무엇을 의미하는지 기억 수는 없지만, 내가 기억했다하면 매우 쉽게 작업에있는 그들을 기억하는 일 그들은 실제로 의미합니다. 같은 함수 호출 leftCompose(parser1, parser2)
이 더 좋았습니까? 확실히 더 장황하지만 어떤면에서는 더 명확합니다.
C와 같은 언어로 된 연산자 오버로드도 비슷한 문제이지만 익숙하지 않은 연산자의 의미 +
를 비정상적으로 새로운 의미 로 오버로드하는 추가 문제로 인해 혼란스러워집니다 .
새로운 언어에서 이것은 꽤 어려운 문제처럼 보일 것입니다. 예를 들어 F #에서 캐스팅은 C # 스타일 캐스트 구문이나 자세한 VB 스타일 대신 수학적으로 파생 된 형식 캐스팅 연산자를 사용합니다. C # : (int32) x
VB : CType(x, int32)
F # :x :> int32
이론적으로 새로운 언어는 대부분의 내장 기능을위한 연산자를 가질 수 있습니다. 대신 def
하거나 dec
또는 var
변수 선언, 왜하지 않는 ! name
나 @ name
또는 비슷한. 선언 @x := 5
대신 에 바인딩을 따라 단축 : 대신 declare x = 5
또는 let x = 5
대부분의 코드는 많은 변수 정의가 필요합니다. 왜 안됩니까?
운영자는 언제 명확하고 유용하며 언제 가려 집니까?
+
문자열 연결 또는 <<
스트림) 에서 연산자를 재사용해야합니다 . 반면에 Haskell을 사용하면 연산자는 사용자 정의 이름을 가진 함수이거나 (오버로드되지 않은) 유형 클래스의 일부이므로 다형성이지만 모든 유형에 대해 동일한 논리적 인 작업을 수행합니다. 같은 형식의 서명도 있습니다. 그래서 >>
이다 >>
모든 유형 결코 조금의 변화가 될 것 없습니다.