3

タイプ セーフを提供するような方法で、シールされたトレイトのエイリアスを作成する方法はありますか? ケースクラスを作成したり、型クラスに頼ることができることはわかっていますが、これらのソリューションはやり過ぎです。

それを説明する簡単な例:

type Lon = Double
type Lat = Double

def lonLatPair(lon:Lon, lat:Lat):(Lon, Lat) = (lon, lat) 

val someLon:Lon = 1.2
val someLat:Lat = 3.4

lonLatPair(someLon, someLat) // Success!
lonLatPair(someLat, someLon) // Dismal failure in the form of a type error
4

1 に答える 1

2

代わりに暗黙のクラスを宣言できます。

implicit class Lon(val value: Double) extends AnyVal
implicit class Lat(val value: Double) extends AnyVal

Lon暗黙的なクラスには、 aまたは aが必要なときにいつでも double を使用できるという利点がありますLat。これにより、割り当てが機能しますが、ユースケースによっては許容範囲が広すぎる場合があります。

このextends AnyVal部分は基本的に、ほとんどの場合、ネイティブ型の代わりにLonorを使用しても実行時のオーバーヘッドがないことを意味します。LatDouble

または、Scalaz ( example ) または shapeless ( example )を使用した「unboxed new type」手法を使用できます。

于 2013-08-31T18:23:53.733 に答える