2015-01-21 2 views
5

시퀀스의 누적 합계를 계산하는 함수가 있습니다. 그것은 일반적인 보이지만제네릭 함수의 제로

let cumsum<'T> = Seq.scan (+) 0 >> Seq.skip 1 >> Seq.toArray 

는 정수 0는 제네릭이 아닌 수, 따라서 나는 수레의 순서로 함수를 호출 할 수 없습니다.

내 하드 코드 된 0을 대체 할 수있는 제로가 있습니까? 아니면 기능을 제네릭으로 만드는 다른 방법 일 수 있습니다.

답변

9

당신은 GenericZero 원시적 사용할 수 있지만 당신은 당신의 함수를 인라인을 명시 적으로 그것을 할 수 없습니다 원칙 값 이후 (지금 당신의 기능이 point-free style로 작성) 함수해야 인라인. cumsum`가 순서 값 대신 인라인 함수 이루어져야

val inline cumsum : 
    s:seq< ^a> -> ^b [] 
    when (^b or ^a) : (static member (+) : ^b * ^a -> ^b) and 
      ^b : (static member get_Zero : -> ^b) 
2
LanguagePrimitives.GenericZero 

:

+2

주'있음 : Type 파라미터를 제거 'T 고정 부재 제약 컴파일러에 의해 자동적으로 추정되는

let inline cumsum s = s |> Seq.scan (+) LanguagePrimitives.GenericZero |> Seq.skip 1 |> Seq.toArray 

참고 즉''인라인 cumsum x = x |> Seq.scan (+) LanguagePrimitives.GenericZero |> Seq.skip 1 |> Seq.toArray'와 같은 효과가 있습니다. – ildjarn

+0

심지어 reddit를 확인할 때가 없었어요! :) – kasperhj

+0

@ildjarn 왜 그런가요? – kasperhj