有人可以向我解释无形文库的用途吗?
有人可以简单地向我解释什么是无形的图书馆?
斯卡拉有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一个值,例如“一个String
,Double
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 。