2012-07-02 6 views
2

나는 인용 부호를 사용하고 있으며 근사값을 찾지 못했습니다. 그래서 나는 이것을 쓰기로 결정했다. 오퍼레이터가 상에 매핑되지 그러나많은 연산자로 일반화하기

let inline (=~=) x y = abs x-y < 1.E-10 

는리스트

let test = [1;2] =~= [1;2] //---> error 

것이 가능 (=) 같은 흐름이 연산자를 선언하는 말?

아니면이 'StructuralEquality-ishness "와 같은 새로운 특성을 정의 할 필요?

은?

+0

네,하지만 당신은 편집 할 수 없습니다 목록 유형 - 이미 정의되어 있습니다. 타입이리스트라면 (':? '로) 검사 할 수 있고, 그렇다면 자신의 정의를 사용할 수 있습니다. 그러나 F #에는 타입 클래스가 없습니다. –

답변

5

나는 Unquote를 모르지만 근사 함수/연산자에 대해서는 구조 비교를 구현하는 방법이 있는지 확실하지 않습니다.

당신이 기술을 사용하여 (또는 트릭)를 F # Typeclasses 프로젝트에 사용되는 것과 유사한, "손으로"그렇게하고 싶다면, 여기에 예입니다

type Approximate = Approximate with 
    static member inline ($) (Approximate, x:^n  ) = fun (y:^n) -> float (abs (x-y)) < 1.E-10 
    static member inline ($) (Approximate, x:list< ^n>) = 
     fun (y:list< ^n>) -> 
      x.Length = y.Length && (List.zip x y |> List.forall (fun (a,b) -> (Approximate $ a) b)) 
// More overloads 
let inline (=~=) x y = (Approximate $ x) y 
+0

아주 좋아요. 나의 덕목으로, 당신의 도서관은 이미 이것에 어느 정도 적합 할 수있는 비트를 포함하고 있습니까? – nicolas

+0

그 프로젝트는 데모 프로젝트 일뿐입니다. 목표는 기술을 사용하여 프로덕션에서 사용하지 않는 것입니다. (이 경우에는 아무런 문제가 없습니다.) 이 기능을 구현하기 위해 링크 할 필요는 없습니다. 거기에 정의 된 유형 정의 중 어느 것도이 특별한 경우에 도움이되지는 않지만 그 기술에 관심이 있다면 좋은 참고 자료입니다. – Gustavo

3

http://code.google.com/p/fsharp-typeclasses/는 (그래서 인용을 끝내 사용하지 않은, 말과 새로운 연산자를 정의하기 위해 더 나은가요 이 적용되지 않을 수 있습니다.)

이 함수

'a -> 'b -> bool (requires member (-) and member Abs) 

List 미상의 서명에 봐 이러한 연산자 중 하나를 지원하지 마십시오. 예, 귀하의 기능은 일반 사항이지만 제약 사항 때문에 목록과 함께 사용할 수 없습니다. 한편, 제약 조건이 없으므로 어떠한 유형에도 사용할 수 있습니다. 제약 조건을 제거하기 위해 함수를 다시 작성할 수 있다면 유사하게 사용할 수 있습니다 (그러나 -abs의 사용을 고려하면 어떻게되는지 알 수 없습니다). list이 이러한 연산자와 어떻게 다르게 작용할 것으로 예상됩니까?

+0

= 제약 조건 : 동등성 – nicolas

+0

이 연산자는 그대로 작동하도록 기대하지는 않지만 수정 된 버전입니다. 문제는이 연산자를 가장 일반적인 방법으로 들어 올리는 방법입니다. 리스트에 결과로 나오는 연산자는 그 요소가 당신이 언급 한 제약 조건을 만족 시키도록 요구할 것이고, 원래 연산자를 두리스트의 각 요소에 적용하여 생성 된 결과 목록을 생성 할 것입니다. 예 : – nicolas

+0

@nicolas : 좋은 점은 같지만 같음 모든 타입을 고려하지만'[]'으로 장식 된 것들을 고려하면 매우 약한 제약이다. – Daniel