2015-01-19 5 views
1

다음 함수를 정의하려고합니다 (Seq 모듈 이름에 공백을 공유).연산자 (*)를 사용할 때 형식 추론이 'int`를 선택하는 것을 방지하는 방법

module Seq = 

    let scale value sequence = 
     sequence 
     |> Seq.map (fun v -> v * value) 

그러나 입력 추론 타입 int 될 요소와 값을 부과한다. 이 메서드는 정수 (8 비트, 16 비트 등), 부동 소수점 (단일 및 이중) 등에서 작업 할 수 있습니다.

형식 유추가 int으로 점프되는 이유는 무엇입니까? 더 일반적인 기능? 일반 함수 선언에 대한

+1

관련 항목 : http://stackoverflow.com/questions/10192390/make-function-work-with-all-numeric-types-int-float-long. – DuckMaestro

답변

5

, F #을

그러나, F 번호 것 ("이 * 연산자를"같은 .NET에서 일반적인 제약은 제약 조건을 표현할 수 없습니다) 당신은 숫자 유형 제네릭 함수를 작성하지 않습니다 inline으로 표시하면 일반 숫자 함수를 작성합니다. 이 경우 함수를 호출하고 특정 유형으로 코드를 특수화합니다 (유형 시스템에서는 정적 멤버 제약을 사용하여 요구 사항을 표현합니다).

let inline scale value sequence = 
    sequence 
    |> Seq.map (fun v -> v * value) 

자세한 내용은 in a blog post I wrote some time ago을 참조하십시오.