카레를 사용하기위한 매개 변수 순서


93

해킹 이 발생 flip하거나 \x -> foo bar x 42발생하는 코드가 너무 많기 때문에 매개 변수의 순서를 변경하기 위해 최근에 코드를 두 번 리팩토링했습니다 .

기능 시그니처를 디자인 할 때 커링을 최대한 활용하는 데 도움이되는 원칙은 무엇입니까?

답변:


111

카레 및 부분적 적용을 쉽게 지원하는 언어의 경우 원래 Chris Okasaki가 작성한 매력적인 주장 시리즈가 있습니다.

  • 데이터 구조를 마지막 인수로 지정

왜? 그런 다음 데이터에 대한 작업을 멋지게 구성 할 수 있습니다 . 예 insert 1 $ insert 2 $ insert 3 $ s. 이것은 state의 함수 에도 도움이됩니다 .

"컨테이너"와 같은 표준 라이브러리는 이 규칙을 따릅니다 .

데이터 구조를 먼저 배치하기 위해 대체 인수가 제공되기도합니다. 따라서이를 닫아서 좀 더 간결한 정적 구조 (예 : 조회)에 대한 함수를 생성 할 수 있습니다. 그러나 광범위한 합의는 특히 괄호로 묶인 코드로 당신을 밀어 붙이기 때문에 이것이 승리가 아니라는 것 같습니다.

  • 가장 다양한 주장을 마지막에 두십시오

재귀 함수의 경우 가장 많이 변경되는 인수 (예 : 누산기)를 마지막 인수로 지정하고 가장 적게 변경하는 인수 (예 : 함수 인수)를 시작에 두는 것이 일반적입니다. 이것은 데이터 구조 마지막 스타일과 잘 어울립니다.


Okasaki 관점의 요약은 그의 Edison 라이브러리 (또 다른 데이터 구조 라이브러리)에서 제공됩니다.

  • 부분적 적용 : 부분적 적용 을 용이하게하기 위해 일반적으로 정적 일 가능성이 더 높은 인수가 다른 인수 앞에 나타납니다.
  • 컬렉션이 마지막에 나타납니다 . 작업이 단일 컬렉션을 쿼리하거나 기존 컬렉션을 수정하는 모든 경우 컬렉션 인수가 마지막에 나타납니다. 이것은 Haskell 데이터 구조 라이브러리에 대한 사실상의 표준이며 API에 일정 수준의 일관성을 제공합니다.
  • 가장 일반적인 순서 : 연산이 둘 이상의 데이터 구조에서 잘 알려진 수학적 함수를 나타내는 경우, 인수는 함수의 가장 일반적인 인수 순서와 일치하도록 선택됩니다.

첫 번째 글 머리 기호에 대한 추론으로 데이터 구조에있을 수있는 인수를 마지막에 입력하십시오. 지도, 접기 및 친구를 더 깨끗하게 만듭니다. tl; dr 목록의 항목이 마지막으로 이동합니다.
John F. Miller

1
어쨌든 조회는 연결할 수 없으므로 첫 번째 지점은 제쳐두고 지원하지 않습니다. haskell.org/haskellwiki/Parameter_order 는 다른 방식으로 cogent 인수를 만듭니다.- "Map 유형의 객체는 매핑을 나타내므로 Map 객체를 표현 된 함수로 변환하는 기능을 갖는 것은 당연합니다."
Brandon

11

재사용 가능성이 가장 높은 인수를 먼저 배치하십시오. 함수 인수가 이에 대한 좋은 예입니다. map f동일한 목록에 여러 다른 기능을 매핑하려는 것보다 두 개의 다른 목록 을 사용하려는 경우가 훨씬 더 많습니다.


5
실제로 동일한 목록에 여러 함수를 매핑하는 경우 함수 목록을 만들고 map ($myList)대신 해당 목록을 만들어야합니다 .
Squidly

3

나는 당신이 한 일을하고 좋은 주문을 선택한 다음 다른 주문이 더 낫다는 것이 밝혀지면 리팩토링하는 경향이 있습니다. 순서는 (자연스럽게) 기능을 어떻게 사용할 것인지에 따라 많이 달라집니다.

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