gpt4 book ai didi

scala - 使用 Scala 特征对 C++ 概念进行建模

转载 作者:行者123 更新时间:2023-12-01 01:11:56 26 4
gpt4 key购买 nike

论文 «Type Classes as Objects and Implicits» 中有一些使用 Scala 特征的示例,例如 C++ 概念和 Haskell 类型类。 .我试着写一些类似 InputIterator 的东西概念和 find Scala 中的函数:

concept InputIterator<typename Iter> {
typename value_type;
value_type operator*(Iter);
...
};

template<typename Iter, typename V>
requires InputIterator<Iter> && EqualityComparable<Iter::value_type, V>
Iter find(Iter first, Iter last, V v) {
while (first < last && *first != v)
++first;
return first;
}

我不确定我是否正确理解了特征。但是还是...还有 InputIterator用 Scala 编写的 trait(或者更准确地说——它是 find 函数中使用的方法的简化模拟):
trait InputIterator[Iter] {
type value_type

def <(a: Iter, b: Iter): Boolean
def ++(it: Iter): Unit
def *(it: Iter): value_type
}
EqualityComparable清楚了:
trait EqualityComparable[S, T] {
def ==(s: S, t: T): Boolean
def !=(s: S, t: T): Boolean = !(s == t)
}

但是我们应该如何处理 find ?我想写这样的东西:
def find[Iter, V](first: Iter, last: Iter, x: V)(implicit iterator: InputIterator[Iter], 
cmp: EqualityComparable[iterator.value_type, V]): Iter =
{
while (iterator.<(first, last) && cmp.!=(iterator.*(first), x))
iterator.++(first)
first
}

但它会导致错误“非法依赖方法类型”。我不知道如何“提取”抽象类型 value_type另一种方式。所以结果我得到了这个代码:
trait EqualityComparable[S, T] {
def ==(s: S, t: T): Boolean
def !=(s: S, t: T): Boolean = !(s == t)
}

trait InputIterator[Iter] {
type value_type

def <(a: Iter, b: Iter): Boolean
def ++(it: Iter): Unit
def *(it: Iter): value_type
}

trait VTInputIterator[Iter, VT] extends InputIterator[Iter] {
type value_type = VT
}

class ArrayListIterator[T](a: ArrayList[T], i: Int) {
val arr: ArrayList[T] = a
var ind: Int = i

def curr(): T = arr.get(ind)
def ++(): Unit = { ind += 1 }

override def toString() = "[" + ind.toString() + "]"
}

class InputIterArrList[T] extends VTInputIterator[ArrayListIterator[T], T]{
def <(a: ArrayListIterator[T], b: ArrayListIterator[T]) = {
if (a.arr == b.arr) a.ind < b.ind
else throw new IllegalArgumentException()
}

def ++(it: ArrayListIterator[T]): Unit = it.++()
def *(it: ArrayListIterator[T]) = it.curr()
}

object TestInputIterator extends Application{

def find[Iter, VT, V](first: Iter, last: Iter, x: V)(implicit iterator: VTInputIterator[Iter, VT],
cmp: EqualityComparable[VT, V]): Iter =
{
while (iterator.<(first, last) && cmp.!=(iterator.*(first), x))
iterator.++(first)
first
}

implicit object EqIntInt extends EqualityComparable[Int, Int] {
def ==(a: Int, b: Int): Boolean = { a == b }
}

implicit object inputIterArrListInt extends InputIterArrList[Int]{}

val len = 10;
var arr: ArrayList[Int] = new ArrayList(len);
for (i: Int <- 1 to len)
arr.add(i)
var arrFirst = new ArrayListIterator(arr, 0)
var arrLast = new ArrayListIterator(arr, len)
var r = find(arrFirst, arrLast, 7)
println(r)
}

我们使用类型参数 VT 而不是抽象类型在 def find[Iter, VT, V] .

所以问题是:如何才能做得更好?是否可以使用抽象类型 value_type没有附加类型参数 VT ?

最佳答案

将 find 的签名更改为:

def find[Iter, V, II <: InputIterator[Iter]](first: Iter, last: Iter, x: V)(
implicit iterator: II, cmp: EqualityComparable[II#value_type, V]): Iter

这大概就是你想要表达的。

请注意,您的 Scala 代码实际上与 C++ 代码不同。在 C++ 中 find用途 Iter::value_type但在 Scala 中你使用 InputIterator[Iter]#value_type .

关于scala - 使用 Scala 特征对 C++ 概念进行建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15001138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com