首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在实现不可变数据类型时裁剪Scala中的类型信息

在实现不可变数据类型时裁剪Scala中的类型信息
EN

Stack Overflow用户
提问于 2015-10-10 22:38:56
回答 1查看 44关注 0票数 1

我在想,在Scala中编写简单的BST时,是否有某种方法可以降低冗长级别:

代码语言:javascript
运行
复制
sealed class BST[K <: Ordered[K], V]    
final case class Empty[K <: Ordered[K], V]
final case class Node[K <: Ordered[K], V](key : K, value : V, left :  BST[K, V], right : BST[K, V])

object BST {
  def size[K <: Ordered[K], V](bst: BST[K, V]): Int = bst match {
    case Empty => 0
    case Node(_, _, left, right) => 1 + size(left) + size(right)
  }
}

F#中的等效定义如下所示:

代码语言:javascript
运行
复制
module BST =
  type t<K' : comparison, 'V> =
    | Empty
    | Node of K * V * t<K, V> * t<K, V>

  let rec size = function
    | Empty -> 0
    | Node(_, _, left, right) -> 1 + (size left) + (size right)

我发现特别有问题的是,对于所有函数,必须针对泛型参数和实际参数类型重复相同的yaddayadda。有什么方法可以减少这些东西吗?

EN

回答 1

Stack Overflow用户

发布于 2015-10-10 23:47:20

一种选择是将函数定义为某些隐式融合类中的操作:

代码语言:javascript
运行
复制
sealed class BST[K: Ordering, V]
final case class Empty[K: Ordering, V]() extends BST[K, V]
final case class Node[K: Ordering, V](key: K, value: V, left: BST[K, V], right: BST[K, V]) extends BST[K, V]


object BST {    
  import Ordering.Implicits._

  implicit class BSTOps[K: Ordering, V](val bst: BST[K, V]){
    def size: Int = bst match {
      case Empty() => 0
      case Node(_, _, left, right) => 1 + left.size + right.size
    }

    def :+(kv: (K, V)): BST[K, V] = {
      val (key, value) = kv
      bst match {
        case Empty() => Node(key, value, Empty(), Empty())
        case node@Node(nodeKey, _, _, _) => if (nodeKey > key)
          node.copy(left = node.left :+ kv)
        else node.copy(right = node.right :+ kv)

      }
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33055156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档