수색…


소개

적용 가능한 경우 C 스타일의 언어와 비교하여 설명 된 Haskell의 함수 호출 구문. 이것은 C 스타일의 언어로 백그라운드에서 하스켈에 오는 사람들을 대상으로합니다.

비고

일반적으로 C 스타일의 함수 호출을 Haskell로 변환하는 규칙은 할당, 반환 또는 다른 호출에 포함됩니다. C 스타일 인수 목록의 쉼표를 공백으로 바꾸고 열기를 이동합니다 함수 이름과 매개 변수를 포함하는 C 스타일 호출의 괄호.

어떤 표현식이 완전히 괄호 안에 싸여 있다면, (외부) 괄호 쌍은 표현의 의미에 영향을 미치지 않으므로 가독성을 위해 제거 될 수 있습니다.
괄호를 제거 할 수있는 몇 가지 다른 상황이 있지만 이것은 가독성과 유지 보수성에만 영향을 미칩니다.

기본 함수 호출의 괄호

C 스타일의 함수 호출의 경우

plus(a, b); // Parentheses surrounding only the arguments, comma separated

그러면 하스켈 코드는

(plus a b) -- Parentheses surrounding the function and the arguments, no commas

Haskell에서 괄호는 함수 적용을 위해 명시 적으로 필요하지 않으며 수학과 같이 표현식을 명확하게하는 데에만 사용됩니다. 따라서 대괄호가 표현식의 모든 텍스트를 둘러싸는 경우 괄호는 실제로 필요하지 않으며 다음도 같습니다.

plus a b -- no parentheses are needed here!

C 스타일의 언어에서는 함수가

임베디드 함수 호출의 괄호

앞의 예제에서 우리는 문장의 의미에 영향을 미치지 않았기 때문에 괄호가 필요하지 않았습니다. 그러나, 그들은 종종 아래처럼 더 복잡한 표현에 필요합니다.
C :

plus(a, take(b, c));

Haskell에서 이것은 다음과 같이됩니다 :

(plus a (take b c))
-- or equivalently, omitting the outermost parentheses
plus a (take b c)

이것은 다음과 동등하지 않습니다.

plus a take b c -- Not what we want!

컴파일러는 take 가 함수라는 것을 알고 있기 때문에 인수를 bc 인수에 적용하고 그 결과를 plus 를 원한다는 것을 알 수 있습니다.
그러나 Haskell에서 함수는 다른 함수를 인수로 사용하는 경우가 많으며 함수와 다른 값 사이에는 실제적인 구분이 거의 없습니다. 따라서 컴파일러는 take 가 함수이기 때문에 단순히 사용자의 의도를 추측 할 수 없습니다.

마지막 예제는 다음과 같은 C 함수 호출과 유사합니다.

plus(a, take, b, c); // Not what we want!

부분 신청 - 1 부

Haskell에서는 함수가 부분적으로 적용될 수 있습니다. 우리는 모든 함수가 하나의 인수를 취하고 그 인수가 일정한 수정 된 함수를 반환한다고 생각할 수 있습니다. 이것을 설명하기 위해 다음과 같이 함수를 괄호로 묶을 수 있습니다.

(((plus) 1) 2)

여기서 함수 (plus)1 적용되어 ((plus) 1) , 2 적용되어 함수 (((plus) 1) 2) 산출합니다. plus 1 2 는 인자를 취하지 않는 함수이기 때문에 평범한 값으로 간주 할 수 있습니다. 그러나 하스켈에서는 함수와 값의 차이가 거의 없다.

더 자세히 설명하기 위해 함수 plus 는 인수를 추가하는 함수입니다.
함수 plus 1 은 인수에 1 을 더하는 함수입니다.
함수 plus 1 21 에서 2 를 더하는 함수이며, 항상 3 입니다.

부분 신청 - 2 부

또 다른 예로, 함수와 값 목록을 사용하여 함수를 목록의 각 값에 적용하는 함수 map 이 있습니다.

map :: (a -> b) -> [a] -> [b]

우리가 목록의 각 값을 증가시키고 싶다고합시다. 자신의 함수를 정의하여 함수에 인수를 추가하고 함수를 사용자의 목록에 map 할 수도 있습니다

addOne x = plus 1 x
map addOne [1,2,3]

그러나 addOne 의 정의를 다른면에서 addOne 강조를 위해 괄호가 추가되었습니다.

(addOne) x = ((plus) 1) x

addOne 함수는 임의의 값 x 적용될 때 부분 적용 함수 plus 1 x 적용되는 plus 1 것과 같습니다. 이 기능 수단 addOne 하고 plus 1 동일하며, 단지 우리가 대체하여 새로운 함수를 정의 피할 수 addOne 함께 plus 1 분리 괄호를 사용하여 기억 plus 1 서브 표현식 같이

map (plus 1) [1,2,3]


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow