LimitedString[Limit]
のようなタイプを作成したいと思います。ここで、Limit
は文字列の最大長の型表現です。時間のないシングレスシングルトンタイプを指定する方法
それは私が把握することはできませんが、実際にLimit
のために(キーボードのように)(コンパイルのように)タイプを入力する方法である
class LimitedString[Limit] [private](val s: String)
object LimitedString {
private def getLimit[Limit]: Int = ??? // turn `Limit` type into a value
def truncate[Limit](s: String) = new LimitedString[Limit](s take getLimit)
def get[Limit](s: String) =
if(s.length < getLimit) Some(new LimitedString[Limit](s))
else None
}
type Str100 = LimitedString[100] // obviously this won't work
def someLibraryMethod(s: Str100) = { ... }
の線に沿って動作します。
私は型崩れのシングルトンタイプに探し始め、あなたが
100.narrow
// res1: Int(100) = 100
を言うことができることがわかった。しかし、私はタイプとしてInt(100)
を使用しようとすると、私はエラーを取得します。
val x: Int(100) = 100
// error: ';' expected but '(' found.
また、def getLimit[Limit]: Int
のようなものを実装するにはどうすればよいですか?
と対話することがより便利に。型としての数値の表現は、その正確な目的(数値<400ish)のようです。より大きなものが必要な場合は、大きなnumで何をすべきかについてのアイデアや議論について[here](https://stackoverflow.com/questions/21296099/limits-of-nat-type-in-shapeless)をチェックしてください。 –
私は現時点で完全な答えを出すことはできませんが、シェイプレスの「証人」を見てください。 'Witness。\' 100 \ '.T'を実行し、実行時の値にアクセスできるようにします。 –
@DavisBroda意図した限界値は100付近にあります。私の 'Str100'型エイリアスを作るために' Succ [Succ [Succ .....]]] 'を100レベルに書き出す必要があるでしょうか? ? – Dylan