私は最近スカラーのタグなしタイプの箱なしについて聞いたことがあります。私はそれがどのように機能するかを知ろうとしていましたが、scalazの実装に問題があったことを指摘していますquestionです。だから今、私は思ったんだけど箱なしのタグ付きのタイプは安全ですか?
type Tagged[U] = { type Tag = U }
type @@[T, U] = T with Tagged[U]
trait Kilogram
trait Meter
type Kg = Double @@ Kilogram
type M = Double @@ Meter
def bmi(mass: Kg, height: M): Double = mass/pow(height, 2)
:その後、私は私のような何かができるオリジナルのアイデアを、と考え
def bmi(mass: Double @@ Kg, height: Double @@ M): Double =
Tag.unwrap(mass)/pow(Tag.unwrap(height), 2)
:修正の結果の一つは、明示的なアンラップにタグ付けされたタイプを持っていました以前のscalazで見つかった問題がそのアプローチに固有であるのか、単純な実装でも消去、配列またはvarargsに問題がある可能性があります。私はまだスカラを学んでいるので、私の理解はタイプシステムであり、私自身はそれを理解できませんでした。
これは事実です。同僚は、::: List.empty [Int @@ Max] 'にすべきだとはっきりしています。しかし、ボックス化されていないタグ付きのタイプのためにバグではなく、単純なサブタイプ化もそれを引き起こすので、私はしばらくの間別のものを探すつもりです。 – andrepnh
'::: List.empty [Int]'の代わりに:: :: List.empty [Int @@ Max] 'を追加しても、バグは発生しません。私はあなたがここで何が起こっているのか理解していないかもしれないと思う。この問題は、サブタイプを使用して新しいタイプを生成して、タイプ・クラスを再定義するために発生します。シンプルなサブタイプ化もそれを引き起こすことは間違いありませんが、これはまさに問題です。上の例で 'class MaxInt extends Int'を定義してから' Int @@ Max'を 'MaxInt'に置き換えることができるとしましょう。これは本質的に同じことです。 – drstevens
あなたはbmiの例ですが、このパターンを使用する理由の良い例ではありません。ソースに含まれているサンプルを参照してください。私は 'Max'から私の例をモデル化しましたhttps://github.com/scalaz/scalaz/blob/series/7.3.x/example/src/main/scala/scalaz/example/TagUsage.scala#L76-L79 – drstevens