タイプによるサイズ変更対応版

// address.scala
object address {

        sealed abstract class T
        case class IntT(a:Int) extends T
        case class ByteT(a:Int) extends T

        var address = 0

        def main(argv:Array[String]) {
                val vars = List(("a",IntT(2)),("b",ByteT(5)),("a",IntT(3)),("d",IntT(5)),("e",ByteT(6)));
                val addressMap = calcAddress(vars,Map())
                println("addressMap "+ addressMap)
        }

        def calcAddress(vars:List[(String,T)],addressMap:Map[String,Int]):Map[String,Int] =
        vars match {
        case List() => addressMap
        case (name,value)::xs =>
                if(addressMap.contains(name)) {
                        calcAddress(xs, addressMap)
                } else {
                        val addr = address
                        address += typeSize(value)
                        calcAddress(xs, addressMap + (name -> addr))
                }
        }
        def typeSize(t:T):Int = t match {
        case IntT(_) => 4
        case ByteT(_) => 1
        }
}
>scalac address.scala
>scala address
>addressMap Map(a -> 0, b -> 4, d -> 5, e -> 9)