2017-09-12 13 views
4

는 "싱글 타입"의 종류 :우리는 볼품를 통해 문자 유형을 만들 수 있습니다

import shapeless.syntax.singleton._ 
var x = 42.narrow 
// x: Int(42) = 42 

그러나이 유형의 별칭을 만들조차 불가능하면 어떻게 유형으로 Int(42) 작동 할 수

type Answ = Int(42) // won't compile 
// or 
def doSmth(value: Int(42)) = ... // won't compile 

답변

5

1) Typelevel Scala에서 방금

val x: 42 = 42 

type Answ = 42 

def doSmth(value: 42) = ??? 

2) 무서 Dotty에서 쓸 수 있습니다 당신은 똑같이 쓸 수 있어요.

3) Lightbend Scala (즉, 표준 스칼라에서) + 무형의 당신이 경우 1에서

import shapeless.Witness 
import shapeless.syntax.singleton._ 

val x: Witness.`42`.T = 42.narrow 

type Answ = Witness.`42`.T 

def doSmth(value: Witness.`42`.T) = ??? 

를 쓸 수 있습니다) build.sbt 경우 2 년

scalaOrganization := "org.typelevel" 
scalaVersion := "2.12.3-bin-typelevel-4" 
scalacOptions += "-Yliteral-types" 

을해야한다) build.sbt해야한다

scalaOrganization := "ch.epfl.lamp" 
scalaVersion := "0.3.0-RC2" 

및 plugins.sbt

0 경우

addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.1.5") 
3) build.sbt는

scalaOrganization := "org.scala-lang" 
scalaVersion := "2.12.3" 
libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.2" 

4 있어야한다) 또는 동시에 Typelevel 스칼라와 볼품를 사용할 수 있습니다.

1

Int(42)은 (는) 올바른 Scala 구문 유형이 아닙니다.

IIRC 싱글 톤 유형은 잠시 동안 scalac에서 구현되었지만 프로그래머는 그러한 정의 구문을 사용하지 않았습니다. Shapeless는 매크로와 더불어 추가 기계를 제공합니다.

특히, shapeless.Witness은 유형 정보와 관련 값을 모두 포함하는 객체이며 둘 중 하나에서 소환 할 수도 있습니다.

import shapeless.Witness 
import shapeless.syntax.singleton._ 
import shapeless.test.illTyped // test string for causing type-errors when compiled 

// --- Type aliases --- 
val w = 42.witness 
type Answ1 = w.T // that is your Int(42) singleton type 
type Answ2 = Witness.`42`.T // same, but without extra variable 
implicitly[Answ1 =:= Answ2] // compiles, types are the same 

// --- Value definitions --- 
val a: Answ1 = 42 // compiles, value OK, and no need to `narrow` 
illTyped { "val b: Answ1 = 43" } // would not compile 
val c: Witness.`43`.T = 43 // that syntax is OK here too 

// --- Summoning values --- 
val answ = Witness[Answ1].value // will not compile for non-singleton 
def genericSingletonMethod[A](implicit W: Witness.Aux[A]) = s"Summoning ${W.value}" 
assert { genericSingletonMethod[Answ1] == "Summoning 42" } 
assert { genericSingletonMethod[Witness.`"string"`.T] == "Summoning string" }