2016-08-10 6 views
2

현재 일부 연습은 exercism.io에서하고 있습니다. 한 가지 예제 중 하나는 다른 순서의 하나 이상의 숫자의 배수 인 모든 순서의 숫자를 합산하는 것입니다. 작은 기능에 문제를 분할 좋은 생각처럼 보였다 그리고 난이 함께했다 :매개 변수 순서 변경을 피하는 방법

let multipleOf m n = 
    n % m = 0 

let anyMultipleOf (m: int list) n = 
    m 
    |> Seq.exists (multipleOf n) 

let sumOfMultiples m n = 
    [1..n-1] 
    |> Seq.filter (anyMultipleOf m) 
    |> Seq.sum 

아이디어의 존재를, 난 내 (any)multipleOf 기능에 m 매개 변수를 "에서 구워"하는 부분 응용 프로그램을 사용할 수 있습니다. 그러나이 코드는 내가 원하는 방식으로 작동하지 않습니다. Seq.exists (multipleOf n)은 실제로 을 내 m 매개 변수로 적용하기 때문입니다.

multipleOf 함수의 매개 변수 순서를 바꾸지 않고도이 코드를 리팩토링 할 수 있습니까?


참고 : 내 anyMultipleOf 함수 내에서 내 multipleOf 함수를 사용하는 솔루션을 원한다. 이 솔루션은 작동하지만 내 첫 번째 함수 재사용하지 않습니다

let anyMultipleOf (m: int list) n = 
    m 
    |> Seq.exists (fun x -> n % x = 0) 
+1

둘 다'multipleOf'와'anyMultipleOf'는 실제로 역순으로 매개 변수를 가져야합니다. 매개 변수는보다 일반적으로보다 구체적으로 정의됩니다. '(any) MultipleOf x'를 현재보다 더 재사용 할 수있는 점이 있습니다 – Sehnsucht

+1

내 사고 과정은 정확히 다른 방향입니다. 'let anyMultipleOfMyNumbers = anyMultipleOf [3; 5; 7]' –

+0

이것 역시 잘 작동합니다 :'let filterMultiplesOf5 numlist = numlist |> Seq.filter (multipleOf 5)' –

답변

4

I flip를 사용하는 제안에 유형을했지만 할 수있는 분명한 것은 이것이다 :

let anyMultipleOf (m: int list) n = 
    m 
    |> Seq.exists (fun x -> multipleOf x n) 

flip이 가지고있는 좋은 도구이지만 반전 기능의 파이프 라인 읽기가 고통이다.

+0

While 플립과 똑같습니다. 나는 당신의 솔루션을 더 좋아합니다. 매개 변수가있는 곳이 더 명확하며 더 많은 매개 변수가있을 때 읽는 것이 더 쉽습니다. –

2

당신은 자신에게 단지 않는 함수 정의 할 수 있습니다 :
함수와 반대 순서로 두 인수를 취 및 인수를 적용한 결과를 반환을 마지막 인수로 목록을 취할 anyMultipleOf를 재정의하지 않는 이유는 나에게 불분명하지만 함수의 올바른 순서

let flip f y x = f x y 
3

, 당신은 항상 사용할 수 있습니다 flip :

let flip f x y = f y x 

이 함수는 exists in Haskell이지만 FSharp.Core에는 포함되어 있지 않으므로 직접 정의해야합니다.

예를 들어, flip anyMultipleOfint -> int list -> bool 유형의 함수를 반환하는데, 질문을 올바르게 이해하면 원하는 것입니다.

관련 문제