2017-05-26 7 views
3

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のようなものを実装するにはどうすればよいですか?

+0

と対話することがより便利に。型としての数値の表現は、その正確な目的(数値<400ish)のようです。より大きなものが必要な場合は、大きなnumで何をすべきかについてのアイデアや議論について[here](https://stackoverflow.com/questions/21296099/limits-of-nat-type-in​​-shapeless)をチェックしてください。 –

+1

私は現時点で完全な答えを出すことはできませんが、シェイプレスの「証人」を見てください。 'Witness。\' 100 \ '.T'を実行し、実行時の値にアクセスできるようにします。 –

+0

@DavisBroda意図した限界値は100付近にあります。私の 'Str100'型エイリアスを作るために' Succ [Succ [Succ .....]]] 'を100レベルに書き出す必要があるでしょうか? ? – Dylan

答えて

2

私はShaplessのWitnessに見てTravisBrownの提案@取り、この思い付いた:それを動作させる主要なもの

import shapeless._ 

object MyLibraryThing { 
    type Name = LimitedString[Witness.`50`.T] 
    object Name extends LimitedStringCompanion[Witness.`50`.T] 

    def rename(id: Int, name: Name) = { ... } 
} 

    class LimitedString[Limit <: Int] private[util](val s: String) extends AnyVal { 
        override def toString = s 
    } 
    class LimitedStringCompanion[Limit <: Int : Witness.Aux]{ 
        def limit: Int = implicitly[Witness.Aux[Limit]].value 
    
        def unapply(s: String): Option[LimitedString[Limit]] = { 
         if(s.length > limit) None else Some(new LimitedString(s)) 
        } 
    
        def truncate(s: String): LimitedString[Limit] = new LimitedString(s take limit) 
    } 
    

    使い方

  • Witness.Auxは、シングルトンを取得するために使用できるtypeclassですvalueバックタイプ
  • のうち、シングルトンタイプWitness.`50`.Tは実際にInt
  • タイプエイリアスのサブタイプである不定形 `Nat`を通じて、教会のエンコーディングを使用しないのはなぜ
+0

"コンパニオン"についての不満は、コンパイラが 'Name 'を含む暗黙的な内容を自動的には検索しないということです'は型のエイリアスです。 – Dylan

関連する問題