需要实现此代码请帮我理解,
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
。现在我们有了emptyMap
和put
,这应该不难实现了。
在实现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)
}