해킹 이 발생 flip
하거나 \x -> foo bar x 42
발생하는 코드가 너무 많기 때문에 매개 변수의 순서를 변경하기 위해 최근에 코드를 두 번 리팩토링했습니다 .
기능 시그니처를 디자인 할 때 커링을 최대한 활용하는 데 도움이되는 원칙은 무엇입니까?
답변
카레 및 부분적 적용을 쉽게 지원하는 언어의 경우 원래 Chris Okasaki가 작성한 매력적인 주장 시리즈가 있습니다.
- 데이터 구조를 마지막 인수로 지정
왜? 그런 다음 데이터에 대한 작업을 멋지게 구성 할 수 있습니다 . 예 insert 1 $ insert 2 $ insert 3 $ s
. 이것은 state의 함수 에도 도움이됩니다 .
“컨테이너”와 같은 표준 라이브러리는 이 규칙을 따릅니다 .
데이터 구조를 먼저 배치하기 위해 대체 인수가 제공되기도합니다. 따라서이를 닫아서 좀 더 간결한 정적 구조 (예 : 조회)에 대한 함수를 생성 할 수 있습니다. 그러나 광범위한 합의는 특히 괄호로 묶인 코드로 당신을 밀어 붙이기 때문에 이것이 승리가 아니라는 것 같습니다.
- 가장 다양한 주장을 마지막에 두십시오
재귀 함수의 경우 가장 많이 변경되는 인수 (예 : 누산기)를 마지막 인수로 지정하고 가장 적게 변경하는 인수 (예 : 함수 인수)를 시작에 두는 것이 일반적입니다. 이것은 데이터 구조 마지막 스타일과 잘 어울립니다.
Okasaki 관점의 요약은 그의 Edison 라이브러리 (또 다른 데이터 구조 라이브러리)에서 제공됩니다.
- 부분적 적용 : 부분적 적용 을 용이하게하기 위해 일반적으로 정적 일 가능성이 더 높은 인수가 다른 인수 앞에 나타납니다.
- 컬렉션이 마지막에 나타납니다 . 작업이 단일 컬렉션을 쿼리하거나 기존 컬렉션을 수정하는 모든 경우 컬렉션 인수가 마지막에 나타납니다. 이것은 Haskell 데이터 구조 라이브러리에 대한 사실상의 표준이며 API에 일정 수준의 일관성을 제공합니다.
- 가장 일반적인 순서 : 연산이 둘 이상의 데이터 구조에서 잘 알려진 수학적 함수를 나타내는 경우, 인수는 함수의 가장 일반적인 인수 순서와 일치하도록 선택됩니다.
답변
재사용 가능성이 가장 높은 인수를 먼저 배치하십시오. 함수 인수가 이에 대한 좋은 예입니다. map f
동일한 목록에 여러 다른 기능을 매핑하려는 것보다 두 개의 다른 목록 을 사용하려는 경우가 훨씬 더 많습니다.
답변
나는 당신이 한 일을하고 좋은 주문을 선택한 다음 다른 주문이 더 낫다는 것이 밝혀지면 리팩토링하는 경향이 있습니다. 순서는 (자연스럽게) 기능을 어떻게 사용할 것인지에 따라 많이 달라집니다.