如何解决如何确保元组同质?
由于无法控制的原因,我的方法以元组的形式接收输入。该元组应仅包含var1<-rnorm(100)
var2<-rnorm(100)
df<-data.frame(var1,var2)
#Set 1 missing value
df[1,1]<-NA
df[2,1]<-NA
library(tidyverse)
df
df %>%
#I kNow select is somewhat superflurous in this dataframe,but I need it in my example,so I want to be sure I get ti right
select(var1,var2) %>%
is.na() %>%
#The missing values are there.
head()
#How do I add the counts
df %>%
select(var1,var2) %>%
rowwise() %>%
mutate(na=rowSums(is.na(.)))
的实例,即它看起来像Foo
,并且内部不应包含(Foo,Foo ... Foo)
或String
。我想在编译时检查它,而不是在运行时抛出异常。我该如何实现?
下面是我当前拥有的代码,这是不正确的:
Int
我愿意使用Shapeless或Dotty / Scala 3中引入的新功能。
解决方法
在Scala 2的Shapeless中,您可以执行以下操作(Scastie):
def f[T <: Product,H <: HList](tupleOfFoos: T)(
implicit gen: Generic.Aux[T,H],hev: LiftAll[({type E[T] = Foo =:= T})#E,H]
) = tupleOfFoos
LiftAll
确保Foo =:= X
中每个X
都有一个H
实例,并且gen
确保T
和{{1 }}并非完全无关的类型。
在Dotty中,您可以为此添加具有匹配类型的证据参数:
H
这将允许您呼叫type Homogenous[H,T <: Tuple] = T match {
case EmptyTuple => DummyImplicit
case H *: t => Homogenous[H,t]
case _ => Nothing
}
def f[T <: Tuple](tupleOfFoos: T)(using Homogenous[Foo,T]) = tupleOfFoos
,但不能呼叫f((Foo(),Foo(),Foo()))
。
f((1,2,3))
是一种递归匹配类型,其基本情况为Homogenous
。如果一个元组为空,则它不填充非EmptyTuple
,因此类型变为Foo
,它的作用域已经是隐式的。否则,我们检查其外观是否类似于DummyImplicit
/ (H,...)
,在这种情况下,我们需要检查其余的元组(H *: t
)是否也有效。如果它与第二种情况不匹配,则我们知道该元组无效,在这种情况下,结果为t
,这是理智的人不会赋予的隐式值。
如果要使用上下文边界,则可以设置其他咖喱类型(Scastie):
Nothing
不幸的是,我无法使它与单一咖喱类型(Scastie)一起使用:
type Homo2[H] = [T <: Tuple] =>> Homogenous[H,T]
def f[T <: Tuple : Homo2[Foo]](tupleOfFoos: T) = tupleOfFoos
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。