def append
(f1
: F, f2
: F
): F
}
def fold
[F
](as
: Seq
[F
])(implicit m
: Monoid
[F
]): F
= as.
foldLeft(m.
zero)(m.
append) }
case class Fuel
[F
<: FuelType
](amount
: Double, fuelType
: F
= Petrol
) { def +
(that
: Fuel
[F
]): Fuel
[F
] = { copy
(amount
= this.
amount + that.
amount) }
}
def add
[F
<: FuelType
](x
: Fuel
[F
], y
: Fuel
[F
]): Fuel
[F
] = x + y
}
}
}
}
override def append
(m1
: Fuel
[F
], m2
: Fuel
[F
]): Fuel
[F
] = m1 + m2
}
}
def main
(args
: Array
[String
] ) { println(Fuel(10, Petrol) + Fuel(20, Petrol))
println(add(Fuel(10, Petrol), Fuel(20, Petrol)))
println(Monoid.fold(Seq(Fuel(10, Petrol), Fuel(20, Petrol), Fuel(30, Petrol))))
}
}
b2JqZWN0IEZ1ZWxzIHsKCiAgdHJhaXQgTW9ub2lkW0ZdIHsKICAgIGRlZiB6ZXJvOiBGCiAgICBkZWYgYXBwZW5kKGYxOiBGLCBmMjogRik6IEYKICB9CgogIG9iamVjdCBNb25vaWQgewogICAgZGVmIGZvbGRbRl0oYXM6IFNlcVtGXSkoaW1wbGljaXQgbTogTW9ub2lkW0ZdKTogRiA9IGFzLmZvbGRMZWZ0KG0uemVybykobS5hcHBlbmQpCiAgfQoKICBjYXNlIGNsYXNzIEZ1ZWxbRiA8OiBGdWVsVHlwZV0oYW1vdW50OiBEb3VibGUsIGZ1ZWxUeXBlOiBGID0gUGV0cm9sKSB7CiAgICBkZWYgKyh0aGF0IDogRnVlbFtGXSk6IEZ1ZWxbRl0gPSB7CiAgICAgIGNvcHkoYW1vdW50ID0gdGhpcy5hbW91bnQgKyB0aGF0LmFtb3VudCkKICAgIH0KICB9CgogIGRlZiBhZGRbRiA8OiBGdWVsVHlwZV0oeDogRnVlbFtGXSwgeTogRnVlbFtGXSk6IEZ1ZWxbRl0gPSB4ICsgeQoKICBzZWFsZWQgdHJhaXQgRnVlbFR5cGUgewogICAgdmFsIG5hbWUgOiBTdHJpbmcKICB9CiAgaW1wbGljaXQgY2FzZSBvYmplY3QgUGV0cm9sIGV4dGVuZHMgRnVlbFR5cGV7CiAgICBvdmVycmlkZSB2YWwgbmFtZSA9ICJQZXRyb2wiCiAgfQogIGltcGxpY2l0IGNhc2Ugb2JqZWN0IERpZXNlbCBleHRlbmRzIEZ1ZWxUeXBlewogICAgb3ZlcnJpZGUgdmFsIG5hbWUgPSAiRGllc2VsIgogIH0KICBpbXBsaWNpdCBjYXNlIG9iamVjdCBIeWRyb2dlbiBleHRlbmRzIEZ1ZWxUeXBlewogICAgb3ZlcnJpZGUgdmFsIG5hbWUgPSAiSHlkcm9nZW4iCiAgfQoKICBpbXBsaWNpdCBkZWYgZnVlbE1vbm9pZFtGIDw6RnVlbFR5cGVdKGltcGxpY2l0IGZ1ZWxUeXBlOiBGKTogTW9ub2lkW0Z1ZWxbRl1dID0gbmV3IE1vbm9pZFtGdWVsW0ZdXSB7CiAgICBvdmVycmlkZSBkZWYgemVybzogRnVlbFtGXSA9IEZ1ZWwoMCwgZnVlbFR5cGUpCiAgICBvdmVycmlkZSBkZWYgYXBwZW5kKG0xOiBGdWVsW0ZdLCBtMjogRnVlbFtGXSk6IEZ1ZWxbRl0gPSBtMSArIG0yCiAgfQp9CgpvYmplY3QgTWFpbiB7CiAgZGVmIG1haW4gKGFyZ3M6IEFycmF5W1N0cmluZ10gKSB7CiAgICBpbXBvcnQgRnVlbHMuXwogICAgcHJpbnRsbihGdWVsKDEwLCBQZXRyb2wpICsgRnVlbCgyMCwgUGV0cm9sKSkKICAgIHByaW50bG4oYWRkKEZ1ZWwoMTAsIFBldHJvbCksIEZ1ZWwoMjAsIFBldHJvbCkpKQogICAgcHJpbnRsbihNb25vaWQuZm9sZChTZXEoRnVlbCgxMCwgUGV0cm9sKSwgRnVlbCgyMCwgUGV0cm9sKSwgRnVlbCgzMCwgUGV0cm9sKSkpKQogIH0KfQo=