Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中泛型函数的奇数问题_Scala_F# - Fatal编程技术网

Scala中泛型函数的奇数问题

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(

我正在学习一点Scala,看看它与F#相比如何,F#是我大部分时间用来学习的东西。我正在尝试一种非常简单的函数记忆技术。在F#中,我会使用如下内容:

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 _
}

啊,现在我明白了。谢谢!