4

하스켈의 함수 적용 대신 함수 이름 연결이 함수 구성과 동일하다는 독창적 인 개념의 연결 언어에 대해 배우고 있습니다.연결하는 하스켈 변형 만들기 : 애플리케이션 및 컴포지션의 우선 순위

Joy, Forth 또는 Factor는 접미어이며 스택 기반이지만 옴과 같은 몇 가지 접두사 연결 언어가 있습니다.

하스켈 변형이 이론적으로 구성 우선 순위 (현재 9)를 응용 프로그램 우선 순위 (현재 10)로 바꾸거나 (또는 ​​동등 함으로서) 이론적으로 연결 언어가 될 수 있는지 궁금합니다.

하스켈의 값이 제로 인수 함수 인 경우, 함수 응용 프로그램이 함수 작성과 다른 이유는 무엇입니까?, 제로 인수 함수로 작성한 것과 같은 함수 응용 프로그램이 아닙니다.

새로운 합성 및 응용 프로그램 운영자를 다른 우선 순위로 정의하고 괄호없이 간단한 연결을 composition?이라고 가정하여 연결 구문을 Haskell 구문으로 변환하는 인터프리터 또는 프리 컴파일러를 간단한 방법으로 만들 수 있습니까? 나는 이것이 단지 문법의 문제라고 생각한다. 잘못되었다고 생각하니 하스켈에서 괄호 나 $ 연산자를 사용해야하는 많은 경우를 피할 것이다. 아니면 구문과 우선 순위뿐만 아니라 더 근본적인 문제입니까?

힌트 : 하스켈에있는 모든 함수와 연산자가 접두어라고 가정하면 중절 표기법과 모든 종류의 "구문 설탕"에 대해이 연습을 잊어 버릴 수 있습니다.

+5

하스켈의 값은 단지 상수 함수가 아닙니다. 그것들은 전혀 기능이 아닙니다. 아니면 기껏해야, 당신이 이러한 것들에 대해 이야기하는 방식을 남용하고 싶다면, 0 상수 함수 ("상수"는 의미있는 설명이 아닙니다 - 정확하게 무엇에 대한 상수입니까?). –

+2

참고 자료 [Haskell의 연속적인 행 다형 프로그래밍] (https://github.com/leonidas/codeblog/blob/master/2012/2012-02-17-concatenative-haskell.md) 및 [연결 패키지] (https://hackage.haskell.org/package/concatenative-1.0.1/docs/Control-Concatenative.html), 덧붙여 말하자면 "연결 프로그래밍 하스켈"에 대한 Google의 두 가지 히트 곡입니다. –

+0

@ daniel-wagner, 맞습니다. 인수가없는 함수는 상수 함수가 아닙니다. 죄송합니다. 따라서 두 번째 함수에 인수가없는 경우 함수 응용 프로그램을 함수 구성으로 볼 수 있습니다. 이 해석은 "가치"와 기능 응용 프로그램 사용을 피하고 모든 것이 기능과 구성입니다. 이것은 연결 방법이며, 하스켈이 연결 방식으로 사용될 수 있는지 확인하려고합니다. 첫 번째 레퍼런스는 그 질문에 대답하고 하스켈에서 연결 구문을 구현하는 아주 좋은 시도이다. 고맙습니다. – enrique

답변

5

하스켈의 값이 상수 함수 인 경우, 함수 응용 프로그램이 함수 작성과 다른 이유는 무엇입니까?, 상수 함수로 작성한 것과 같은 함수 응용 프로그램이 아닙니다.

하스켈의 값은 "상수 함수"가 아닙니다. 그것들은 "무효 기능"도 아니다. 함수 인 하스켈의 유일한 함수는 타입이 함수 화살표 생성자 ->을 포함하는 것입니다.

상수 함수는 입력이 주어지면 동일한 출력을 반환합니다. const 함수 번째 인자를 무시하고 항상 제를 반송하는 기능을 편리하게 구축 0

alwaysOne x = 1 

map alwaysOne [1..5] == [1, 1, 1, 1, 1] 

이러한 함수의 도함수이다.

map (const 1) [1..5] == [1, 1, 1, 1, 1] 
는 "null의 기능"의 개념은 기능이 여러 인수-에서 하스켈을 수있는 언어로 의미가

여러 인수 기능의 정의는 하나 개의 인수와 체인 기능의 정의에 대한 문법 설탕 있습니다 currying으로 알려진 과정에서. 이 모든 정의는 동일합니다.

foo x y = x + y 

foo x = \y -> x + y 

foo = \x -> \y -> x + y 

(실제로, 멀티 인수 기능의 효율성을 이유로, GHC의 런타임 거래를하고 부분적으로 만 적용 기능에 대한 폐쇄 개체를. 구축)

나는 구문의 단지 문제라고 생각합니다 , 내가 잘못?

연결 언어의 기본 개념은 프로그램이 함수를 나타내는 것이며 두 프로그램을 연결하면 해당 함수의 구성을 나타내는 프로그램이 제공된다는 것입니다. 따라서 f이 함수이고 g이 함수 인 경우 f g은 하스켈에서 쓸 내용을 g . f으로 나타내는 프로그램입니다. 추상적 인 대수학 용어에서, 구문 론적 인 모노 노드에서 의미 론적 인 모노oid 로의 유사 동형이 있습니다. 그것이 구문의 문제입니다.

그러나 의미 문제도 있습니다. 이러한 함수는 암묵적으로 전달되는 프로그램 상태를 조작해야하며 실제 프로그램의 상태는 복잡합니다. 따라서 실제로는 연결 언어가 값의 스택을 나타내는 튜플을 사용하는 경향이 있습니다. 이는 실제로 간단하게 구현할 수 있기 때문에 효율적입니다 하드웨어. 이론적으로 프로그램 상태는지도 나 집합과 같은 모든 것이 될 수 있습니다.

나는 하스켈의 의미는 여기에 실제 장애물 블록 생각, 당신은 하스켈로 concatenative DSL을 포함 할 수 있지만, 당신은 매일 매일이 사용할 수 있도록하기 위해 concatenative 언어 필요 프로그램 작성.

+0

@Jon (당신의 "새끼 고양이"에 대해 읽었습니다.) 감사합니다. :)). 당신은 말합니다 : "이 함수들은 ** 그들 사이에 암묵적으로 ** 전달 된 ** 프로그램 상태를 조작해야만합니다. 그러나 이것으로부터 _state_에 대한 함의를 추론 할 수는 없습니다 :"프로그램은 함수를 나타내며 두 ​​프로그램을 연결하면 그 기능들의 구성 "을 의미한다. (명시 적) 상태가없는 연결 구문은 불가능합니까?, 이유는 무엇입니까? 그리고 연결 프로그래밍 문법에 가까운 모나드 또는 화살표로 프로그래밍하고 있습니까? (함수는 이전의 액션/상태를 취하고 액션/상태를 다음 액션으로 전달합니다). – enrique

+2

@enrique : 스택 언어에서 모든 함수는 스택을 입력으로 받아들이고 스택을 출력으로 반환합니다. 실제로이 스택 조작은 내부에서 수행되므로 스택은 프로그램의 상태를 나타냅니다. 프로그램이 나타내는 함수를 실행하기 위해서는 입력을해야하므로 초기 상태는 빈 스택입니다. 불순한 연속 언어에서 "push"는'return '에 해당하고,'push '는'IO'에서 모나드 구성 ('> =>')으로 구성된다고 가정합니다. –