scala – 将无可拉伸的可扩展记录传递给函数
我正在尝试学习Shapeless(使用版本2.10.2)。我创建了一个非常简单的可扩展记录:
val rec1 =(“foo”→>> 42):: HNil 根据REPL,这种类型 shapeless.::[Int with shapeless.record.KeyTag [String(“foo”),Int],shapeless.HNil] 我试图定义一个简单的函数: def fun(x: ::[Int with KeyTag[String("foo"),Int],HNil]) = x("foo") 但它甚至不编译。我不能在类型声明中使用String(“foo”),并获得错误。 我有两个问题: >如何在我的代码中指定可扩展记录的类型? 编辑 我发现: val rec1 = ("foo" ->> 42) :: HNil val rec2 = ("foo" ->> 43) :: HNil var x = rec1 x = rec2 效果很好。我总结rec1,rec2和x是相同的类型。我只是不知道如何在代码中表达那种类型! 解决方法
这里有一些更一般的东西,我认为可以回答你的问题。假设我们要编写一个可以使用“foo”键在任何记录上工作的方法。我们可以使用证人和选择器的组合:
import shapeless._,record._,syntax.singleton._ val w = Witness("foo") def fun[L <: HList](xs: L)(implicit sel: ops.record.Selector[L,w.T]) = xs("foo") 接着: scala> fun(("foo" ->> 42) :: HNil) res0: Int = 42 要么: scala> fun(("bar" ->> 'a) :: ("foo" ->> 42) :: HNil) res1: Int = 42 如果我们真的只想允许没有其他字段的记录,我们可以写下列内容: def fun(l: Int with KeyTag[w.T,Int] :: HNil) = l("foo") 但这与记录通常使用的方式有些不一致。 我们必须定义证人,正是因为Scala 2.10不提供任何方式直接提及单身人士,例如参见Alois Cochard的Shona项目my fork项目进行一些讨论。 我会添加一个最后的免责声明,我只是刚刚熟悉Shapeless 2.0自己,但我不认为即使Miles是魔法足以克服这个限制。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- twitter-bootstrap – Bootstrap css只使用glyphicons
- shell 括号的区别
- bash – 跨平台命令行脚本(例如.bat和.sh)
- bootstrap-wysiwyg: 迷你的Bootstrap的所见即所得的HTML富文
- Vim的微型概述
- twitter-bootstrap – 使用Polymer的shadow DOM处理Boostra
- unix – 如何在shell脚本中操作$PATH元素?
- angularjs – 设置reloadOnSearch = false时,如何在angular
- WebService返回DataSet,Xml,Json
- WebServices测试之一-----UFT测试WEBSERVICES