Scala帮助编写Map



需要实现此代码请帮我理解,

object Task {
type Map[K, V] = K => Option[V]
def emptyMap[K, V]: Map[K, V] = ???
def put[K, V](m: Map[K, V], key: K, value: V): Map[K, V] = ???
def delete[K, V](m: Map[K, V], k: K): Map[K, V] = ???
}

不要使用标准库

嗯,你基本上是在尝试将Map[K, V]建模为函数的组合。

正如jwvh所说,第一个(emptyMap)应该非常容易。这样想;给定一个空映射,如果您试图从中检索一个值,您将得到什么?

val map = emptyMap[Int, String]

以这种方式声明map,当我们试图使用键从它检索值时,我们不应该得到任何东西,因为首先那里什么也没有

map(1) == None
map(2) == None

看来emptyMap可以这样实现

def emptyMap[K, V]: Map[K, V] = _ => None

基本上,每次您尝试使用键在其中查找值时,空映射都会返回None

现在让我们看看put。现在我们必须找到一种方法,将新的添加到现有的映射中。由于Map的声明方式,我们使用的是函数,所以添加给地图赋值可能是一项相当困难的任务。但别担心,我们会想出解决办法的。

看看我们是如何实现emptyMap的,我们可以发现put也应该是一个函数,它接受K类型的参数并返回Option[V]类型的值

def put[K, V](m: Map[K, V], key: K, value: V): Map[K, V] = parameter => ???

我们如何返回Option[V]?当参数等于我们刚刚输入的key时,会发生什么呢?(我们只是返回值)

def put[K, V](m: Map[K, V], key: K, value: V): Map[K, V] = 
parameter => if(parameter == key) Some(value) else ???

如果parameter不等于key(我们刚刚用put添加到映射中),这意味着它可能等于映射中的其他键。因为我们的map只是一个等待参数的函数我们可以像这样实现它

def put[K, V](m: Map[K, V], key: K, value: V): Map[K, V] = 
parameter => if(parameter == key) Some(value) else m(parameter)

到目前为止一切顺利。最后一个是delete。现在我们有了emptyMapput,这应该不难实现了。

在实现delete之前,为了更好地理解我们的映射,让我们看看如何使用它

val map = put(emptyMap[Int, String], 1, "A")
val anotherMap = put(map, 2, "B")
anotherMap(1) == Some("A")
anotherMap(2) == Some("B")
map(2) == None

创建map时,我们只是组合等待形参的函数(形参将用于返回值)。只有当我们调用它们(例如map(2))时,它们才会被执行。

考虑到这一点,让我们实现delete。Delete应该带一个键和"Delete";与其关联的值。在我们的例子中,删除一个值仅仅意味着当接收到的参数等于键时,我们应该返回None
def delete[K, V](m: Map[K, V], key: K): Map[K, V] = 
parameter => if(parameter == key) None else ???

但是地图的其余部分呢?我们应该让它保持原样

def delete[K, V](m: Map[K, V], key: K): Map[K, V] = 
parameter => if(parameter == key) None else m(parameter)

秀……总结一下,我们以这样的内容结束。


object Task {
type Map[K, V] = K => Option[V]
def emptyMap[K, V]: Map[K, V] = _ => None
def put[K, V](m: Map[K, V], key: K, value: V): Map[K, V] = 
parameter => if(parameter == key) Some(value) else m(parameter)
def delete[K, V](m: Map[K, V], key: K): Map[K, V] = 
parameter => if(parameter == key) None else m(parameter)
}

相关内容

  • 没有找到相关文章

最新更新