We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
blocked by #160
気持ちとしては次のような表記が通ってほしいわけであるが、今日のRust (※少なくとも、1.69.0) ではコンパイルが通らない:
use core::num::NonZeroU32; fn non_zero(nzu32: NonZeroU32) {} fn main() { non_zero(1); // ^ mismatched types }
そこで、次のようなルールで型Xを持つリテラルxのみを型Tに暗黙昇格する機能をつけたい。こうすることで双方にとってほぼノーコストかつよりtype-safeなプログラムが実現可能である。
X
x
T
Result<T, ?>
3
// Scala 2 / Scala 3 import eu.timepit.refined.api.Refined def forallPredicate[V, P](site: V Refined P) = ??? def generic[V](site: V) = ??? generic(1) // Int Refined ??? forallPredicate(1) // Int Refined ???
もし今日のRustがこのようなシステムを持っていたとして、上述のNonZeroU32の例で言い換えると、以下のとおりになる。
NonZeroU32
u32
TryFrom<u32>
NonZeroU32::new_unchecked
The text was updated successfully, but these errors were encountered:
No branches or pull requests
blocked by #160
気持ちとしては次のような表記が通ってほしいわけであるが、今日のRust (※少なくとも、1.69.0) ではコンパイルが通らない:
そこで、次のようなルールで型
X
を持つリテラルx
のみを型T
に暗黙昇格する機能をつけたい。こうすることで双方にとってほぼノーコストかつよりtype-safeなプログラムが実現可能である。T
は正確にフィールドを一つのみ持たなければならない (注: この制約は過剰である)。このフィールドの型をX
とする。T
は、構築するにあたってX
に対して追加で構成時の要件を持つ必要がある。T
は、X
からResult<T, ?>
への非メンバー関数を持つ必要がある。3
の要件を満たす関数をコンパイラにコンパイラ依存の方法で教える必要がある。X
が型T
の制約を満たしていることを検査せずにそのまま「通す」"unchecked"な関数を持っていて (もちろん、これは安全ではないのでそのように印がつけられる必要がある)、かつコンパイル時にx
がT
の要件を満たしていることが100%確実であれば、x
はそのような"unchecked"な関数を使ってT
へと変換される; これを正しく実装するのはコンパイラの責任である。x
が渡された先がジェネリックサイト、または述語に対して全体量化されたサイトではない。この条件は事実上必要な要件であり、この条件を取り除くと次のようなコードでどの型へ昇格されるのかが不明瞭になる:もし今日のRustがこのようなシステムを持っていたとして、上述の
NonZeroU32
の例で言い換えると、以下のとおりになる。NonZeroU32
はu32
のみをフィールドとして持つ。NonZeroU32
は「ゼロではないu32
を格納する」という追加の要件を持つ。NonZeroU32
はTryFrom<u32>
の実装を持つ。NonZeroU32::new_unchecked
がそれに当てはまる。The text was updated successfully, but these errors were encountered: