微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何确保元组同质?

如何解决如何确保元组同质?

由于无法控制的原因,我的方法元组的形式接收输入。该元组应仅包含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 举报,一经查实,本站将立刻删除。