2011-10-21 22 views
6

Units.scala dosyasında tanımlanan metascala Ölçü Birimleri işlevleriyle çalışırken bir sorunla karşılaştım.Tür düzeyi hesaplamaları kullanırken tür/tür denetimi başarısızlığı yazın.

Bu sorunun geri kalanı için, yalnızca bir Ünite tipi, uzunluğu olan basitleştirilmiş bir şema kullanacağım.

Quantity[_1] 
     ^
      | 
     Length 

kısa sürede tipi anlaşılmaktadır gereken şekilde problemler başlar: Bu sorunu gösterdiği için yeterli olacaktır
Quantity[_1, _0, _0, _0, _0, _0, _0] 
     ^^^^^^^
      | | | | | | | 
      | Mass | Crncy.| Mol | 
     Length Time Temp. Lum.Intensity 

gibi

Yani gerçekte bir tür görünüyor nerede.

(ayrıca UnitsTest.scala kod bakabilirsiniz) Bu örneği ele alalım:

val length: Quantity[_1] = m(5) 
val area: Quantity[_2] = length * length // (1) Works 
val dist: Quantity[_1] = area/length // (2) Doesn't work! 

Dediğim son satırında bir hata alıyorum: Bu derleyicisi gibi görünüyor

type mismatch; 
    found : 
    scalax.units.Units.Quantity[ 
     scalax.units.Subtractables.-[ 
     scalax.units.Integers._2, 
     scalax.units.Integers._1 
     ] 
    ] 

    required: 
    scalax.units.Units.Quantity[ 
     scalax.units.Integers._1 
    ] 

olabilir' eldeki tipin, "bir boyutun çıkarılması" olduğunda, Quantity[_1]'a eşit olduğunu, e. g. alana giden (1) gibi Dist için:

Quantity[_2 - _1] <<not equal to>> Quantity[_1] 

kafa karıştırıcı şey e "bir boyut ekleyerek" ne zaman çalışmasıdır. g. (2) gibi bölgeye uzunluğu giden:.

Quantity[_1 + _1] <<equal to>> Quantity[_2] 

(burada bütün kodunuzu yapıştırmak için üzgünüm, çok fazla adildir benim örnek aza indirmek için çalıştı, ama beceremedim ben sadece bağlama sebebi bu. 1

cevap

2

SubtractableSub, MInt özelliğinde yok. Çalışması için basit bir tanım, MSucc ve MNeg türlerinden bir nesneyi çıkarmak istediğinizde ek bir negatif ekleme gerçekleştirmektir.

sealed trait MInt extends Visitable[IntVisitor] with Addable with Subtractable { 
    type AddType = MInt 
    type SubType = MInt 
    type Add[I <: MInt] <: MInt 
    type Sub[I <: MInt] <: MInt 
    type Neg <: MInt 
    type Succ <: MInt 
    type Pre <: MInt 
} 

final class _0 extends Nat { 
    type Add[I <: MInt] = I 
    type Sub[I <: MInt] = I#Neg 
    type AcceptNatVisitor[V <: NatVisitor] = V#Visit0 
    type Neg = _0 
    type Succ = MSucc[_0] 
    type Pre = Succ#Neg 
} 

final class MSucc[P <: Nat] extends Pos { 
    type This = MSucc[P] 
    type Add[N <: MInt] = P#Add[N]#Succ 
    type Sub[N <: MInt] = Add[N#Neg] 
    type AcceptNatVisitor[V <: NatVisitor] = V#VisitSucc[P] 
    type Neg = MNeg[This] 
    type Pre = P 
    type Succ = MSucc[This] 
} 

final class MNeg[P <: Pos] extends MInt { 
    type Add[N <: MInt] = P#Add[N#Neg]#Neg 
    type Sub[N <: MInt] = Add[N#Neg] 
    type Accept[V <: IntVisitor] = V#VisitNeg[P] 
    type Neg = P 
    type Succ = P#Pre#Neg 
    type Pre = P#Succ#Neg 
} 

Bir şey daha, parametrelerini bölmek ve bunları çarpın olmamalıdır Quantity yılında / yöntemi!

+0

Evet, bu düzeltme. Ben iki düzeltmeyi MetaScala repo'ya adadım. –