有人可以向我解释无形文库的用途吗?

有人可以简单地向我解释什么是无形的图书馆?

斯卡拉有generics和inheritancefunction,所以我有点困惑什么是无形的。

也许一个用例来澄清事情会有所帮助。

这有点难以解释,因为没有形状有一个广泛的特征; 我可能会发现“用简单的术语来解释variables是什么”更容易。 您一定要从function概述开始。

广义而言,无形是关于types的编程。 在编译时做一些事情,这些事情通常在运行时完成,精确地追踪列表中每个元素的types,能够从元组翻译为HList到案例类,创build多态函数(而不是方法),等等

一个典型的使用场景会像这样:

  • 从一个List读取一堆值
  • 将该List的types安全转换为HList
  • HList上映射一个多态函数,例如标准化值
  • 将第三个元素(静态地称为Int )转换为0填充的string
  • 使用HList的值构build一个案例类

作为参考,一个HList将有一个精确的types,如Int :: String :: Boolean :: HNil (是的,这实际上一个单一的types),一切都固定下来,大小是固定的。 所以你要么在编译时知道你的HList将会进入什么状态,要么你需要types安全的转换。

如果你拿这样一个HList的tail ,你会得到一个String :: Boolean :: HNil ,并保证编译时的头部是一个String 。 向头部添加一个值同样会保留所有涉及的types。

Generic type也是无形的,允许你在元组和类的类上使用HList操作。

我倾向于使用的其他function是:

  • Coproducts ,它允许你静态地input一个值,例如“一个StringDouble Int或整数,但没有别的”(非常像,但不限于两种可能性)

  • Lenses ,简化与嵌套案例类的工作。

看着一个HList是可能看起来莫名其妙,直到你尝试使用types和委托或开启types。 看看下面的内容:

 val myList = 1 :: 2 :: "3" :: fred :: Nil 

这里myList的types是myList ? 如果你要检查它,你会发现它是List[Any]types的。 这不是很有帮助。 如果我尝试使用下面的PartialFunction[Any]map它,那么更有帮助的是:

 myList.map{ case x: Int => x case x: String => Int.parseInt(x) } 

在运行时,这可能会抛出一个MatchError因为我实际上没有告诉你什么types的fred 。 它可能是Fred的types。

使用HList ,如果您未能捕捉到列表中的某一种types,则可以在编译时知道。 在上面的myList = 1 :: 2 :: "3" :: fred :: HNil ,如果我在访问第三个元素的时候定义了myList = 1 :: 2 :: "3" :: fred :: HNil ,那么它的types就是String ,这在编译的时候是已知的。

正如@凯文·赖特所说的那样,除了“无形”之外,还有更多的东西,但是HList是图书馆的定义特征之一。

无形中的一切有两个共同点:

首先,它不在Scala标准库中,但应该是可以的。 因此,问什么是无形的是有点像问Scala标准库是为了! 这是为了一切 。 这是一个抓包。

(但它不是一个完全任意的抓包,因为:)

其次,Shapeless中的所有内容在编译时提供了更高的检查和安全性。 没有形状(我能想到的)在运行时实际上“做”了任何事情。 当你的代码被编译时,所有有趣的动作都会发生。 目标总是增加自信,如果你的代码编译完成,它不会在运行时崩溃或做错事。 (因此这个显着的问题: https : //twitter.com/mergeconflict/status/304090286659866624 )

有一个很好的介绍什么types的编程是关于,与进一步的资源的链接,在https://stackoverflow.com/a/4443972/86485