-
-
Notifications
You must be signed in to change notification settings - Fork 480
Description
Today I learned that it is not possible to implement Fill for third-party types, in the form of [T].
I ran into this when I tried implementing Fill for [half::f16] (See f16)
error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
--> /home/andy/dev/projects/half-rs/src/rand_distr.rs:96:1
|
96 | impl rand::Fill for [f16] {
| ^^^^^^^^^^^^^^^^^^^^-----
| |
| this is not defined in the current crate because slices are always foreign
|
= note: impl doesn't have any local type before any uncovered type parameters
= note: for more information see https://doc.rust-lang.org/reference/items/implementations.html#orphan-rules
= note: define and implement a trait or new type instead
Note that I was trying to open a PR on the half crate to implement Fill for f16 and bf16.
Details
I opened a thread in URLO and someone suggested that this would be feasible if the function signature of fill was:
trait Fill {
fn fill(_: &mut [Self], _: &mut impl Rng);
}
Motivation
It is currently not possible to implement this trait for third party types. If I wanted to have Fill implemented for half::f16, I'd have to add half as a dependency on rand, and gate it with a half feature. This doesn't scale.
Alternatives
Fill my [f16] using a different API? However, in my case, I'm working with APIs whose function signature looks like this
fn do_something<T: rand::Fill>(value: &mut T)
which still has the same issue, even I filled the [f16] with a different API.