Scala中泛型函数的奇数问题
我正在学习一点Scala,看看它与F#相比如何,F#是我大部分时间用来学习的东西。我正在尝试一种非常简单的函数记忆技术。在F#中,我会使用如下内容:Scala中泛型函数的奇数问题,scala,f#,Scala,F#,我正在学习一点Scala,看看它与F#相比如何,F#是我大部分时间用来学习的东西。我正在尝试一种非常简单的函数记忆技术。在F#中,我会使用如下内容: open System.Collections.Generic 让我们回忆一下(f:'a->'b)= //用于缓存上一次搜索结果的字典 //函数的调用 让dict=newdictionary() 让MemorizedFunction输入= 将dict.TryGetValue(输入)与 |对,x->x |错误,-> 让答案=f输入 dict.Add(
open System.Collections.Generic
让我们回忆一下(f:'a->'b)=
//用于缓存上一次搜索结果的字典
//函数的调用
让dict=newdictionary()
让MemorizedFunction输入=
将dict.TryGetValue(输入)与
|对,x->x
|错误,->
让答案=f输入
dict.Add(输入,回答)
回答
记忆功能
在尝试在Scala中生成此功能的等效版本时,我想到了以下几点:
def memoize[A, B](f: A => B): A => B = {
val dict = collection.mutable.WeakHashMap[A, B]()
def memoizedFunction[A, B](input: A): B =
dict.get(input) match {
case x: Some[B] => x
case _ =>
val answer = f(input)
dict += ((input, answer))
answer
}
memoizedFunction _
}
在尝试定义此函数时,我在REPL中收到一些错误:
:11:错误:类型不匹配;
找到:input.type(具有基础类型A)
所需:A
dict.get(输入)匹配{
^
:14:错误:类型不匹配;
找到:input.type(具有基础类型A)
所需:A
val应答=f(输入)
^
:15:错误:类型不匹配;
找到:input.type(具有基础类型A)
所需:A
dict+=((输入,回答))
^
有人能指出我的错误在哪里吗?MemorizedFunction上的类型参数将外部类型参数隐藏起来。Scala泛型的本质让我摸不着头脑,但这就是为什么输入的A类型不是Scala所寻找的A 另外,
x:Some[B]
与memorizedfunction
的返回类型冲突,即B。匹配选项的惯用方法是Some(x)=>//使用x做点什么
下面是我对这两件事的修正:
def memoize[A, B](f: A => B): A => B = {
val dict = collection.mutable.WeakHashMap[A, B]()
def memoizedFunction(input: A): B =
dict.get(input) match {
case Some(x) => x
case _ =>
val answer = f(input)
dict += ((input, answer))
answer
}
memoizedFunction _
}
啊,现在我明白了。谢谢!