获取"单身类型"的类型

St.*_*St. 7 scala generic-programming shapeless

我们可以通过无形创建一个文字类型:

import shapeless.syntax.singleton._
var x = 42.narrow
// x: Int(42) = 42
Run Code Online (Sandbox Code Playgroud)

但是,Int(42)如果甚至无法创建类型别名,我如何作为一种类型进行操作

type Answ = Int(42) // won't compile
// or
def doSmth(value: Int(42)) = ... // won't compile
Run Code Online (Sandbox Code Playgroud)

Dmy*_*tin 9

1)在Typelevel Scala中你可以写

val x: 42 = 42

type Answ = 42

def doSmth(value: 42) = ???
Run Code Online (Sandbox Code Playgroud)

2)在Dotty Scala中,您可以编写相同的内容.

3)在Lightbend Scala(即标准Scala)+无形你可以写

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) = ???
Run Code Online (Sandbox Code Playgroud)

如果1)build.sbt应该是

scalaOrganization := "org.typelevel"
scalaVersion := "2.12.3-bin-typelevel-4"
scalacOptions += "-Yliteral-types"
Run Code Online (Sandbox Code Playgroud)

如果2)build.sbt应该是

scalaOrganization := "ch.epfl.lamp"
scalaVersion := "0.3.0-RC2"
Run Code Online (Sandbox Code Playgroud)

和plugins.sbt

addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.1.5")
Run Code Online (Sandbox Code Playgroud)

如果3)build.sbt应该是

scalaOrganization := "org.scala-lang"
scalaVersion := "2.12.3"
libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.2"
Run Code Online (Sandbox Code Playgroud)

4)或者您可以同时使用Typelevel Scala和Shapeless.