2012-05-23 10 views
10

: o sankiF # dan C# örtülü operatörleri kullanmak için zaten var mı? Ben örtük dönüşümle birlikte bir C# sınıfı, çift şöyle varsa

public class Parameter 
{ 
    private double _value; 
    public Parameter(double value) { _value = value } 
    public static implicit operator double(Parameter p) { return _value; } 
} 

F # Bırak kullanmaya çalışınca sevmeyen float:

let a = Parameter(4.0) 
let b = Parameter(2.0) 
let c = a * Math.Sin(b) <-- 'expected float, here Parameter' 

var mı Bunu yapmanın herhangi bir yolu (this question/answer temelli yok tahmin ediyorum) ve değilse iyi bir geçici çözüm ne olurdu?

+0

Düşünceler: Bir 'Değer 'özelliği ekleyebilirim ve her yerde kullanabilirim, güzel değil, ama aklıma gelebilecek başka şeylerin de daha az çirkin ... – Benjol

+1

Ne yazık ki ... http: //stackoverflow.com/questions/1686895/eşdeğerli-oluşturucu-ac-keskin-örtülü-işleç-in-f- –

cevap

17

F # örtülü dönüşüm gerçekleştirmez, ancak bunları çalıştırmak için açık bir operatöre tanımlamanızı sağlar:

açıkça bunu yapmak için çeşitli yollar için buraya bakınız. Bkz kvb's answer to a previous question:

Bu giriş veya sonuç ya örtük dönüştürme operatör temin gerektiğini söylemek statically resolved type parameters kullanıyor
let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) 

- bunlar op_Implicit adlı yöntemlere derlenmektedir böylece statik bir yöntem için F # derleyici denetler Bu özel adıyla.

let a = Parameter(4.0) 
let b = Parameter(2.0) 
let c = !> a * Math.Sin(!> b) 

ben örtülü izin vermeyerek ana nedeni olduğunu düşünüyorum:

!> operatörü kullanarak, artık açıkça böyle kod örneğinde bir float (iki kez) ile Parameter dönüştürmek istediğiniz yeri söyleyebiliriz F # deki dönüşümler, tür çıkarımını biraz daha zorlaştırır ve derleyicinin iyi hata mesajları vermesi zor olur.

+1

Hm, Hangi programın ne kadar başarılı olduğuna karar veremiyorum. * Math.Exp (time.Value) * Math.Sin (B.Value * time.Value) 've'!> A * Math.Exp (|> zaman) * Math.Sin (!> B *!> zaman) ' – Benjol

+0

@Benjol Tamamen katılıyorum - Aslında,' '> operatörünün' .Value' özelliğini kullanmaktan daha çirkin olduğuna ikna oldum. bu yüzden muhtemelen bunu kullanırdım. Diğer genel işlevleri yazmanız gerekirse '!> Operatörü muhtemelen yararlıdır. –