在我自己的列表实现中发现scala中的错误

时间:2015-07-22 11:53:51

标签: scala

我正在使用通用抽象类<?xml version='1.0' encoding='utf-8'?> <widget id="com.phonegap.helloworld" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0"> <name>hi bi</name> <description> sample stuff </description> <author email="support@phonegap.com" href="http://phonegap.com"> PhoneGap Team </author> <content src="index.html" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <preference name="phonegap-version" value="3.3.0" /> <preference name="permissions" value="none" /> <preference name="orientation" value="default" /> <preference name="target-device" value="universal" /> <preference name="fullscreen" value="true" /> <preference name="webviewbounce" value="true" /> <preference name="prerendered-icon" value="true" /> <preference name="stay-in-webview" value="false" /> <preference name="ios-statusbarstyle" value="black-opaque" /> <preference name="detect-data-types" value="true" /> <preference name="exit-on-suspend" value="false" /> <preference name="show-splash-screen-spinner" value="true" /> <preference name="auto-hide-splash-screen" value="true" /> <preference name="android-installLocation" value="auto" /> <icon src="icon.png" /> </widget> 实现我自己的List集合。我想添加一个List[+T]函数,它根据给定的函数更改列表:

map

我在abstract class List[+T] { def map[U>:T](f: T => U): List[U] = this match { case null => this case x :: xs => f(x) :: xs.map(f) } } 中收到以下错误:

  

构造函数无法实例化为期望的type.found Scala.collection.immutable。:: required List [T]

2 个答案:

答案 0 :(得分:1)

首先,您可以阅读scala集合的架构 link

  

总结一下,如果要完全集成新的集合类   进入框架你需要注意以下几点:

     
      
  • 确定集合是否应该是可变的或不可变的。
  •   
  • 为集合选择正确的基本特征。
  •   
  • 从正确的实现特征继承以实现大多数集合操作。
  •   
  • 如果您希望地图和类似操作返回集合类型的实例,请在类的配套对象中提供隐式CanBuildFrom。
  •   

在TraversableLike中实现地图:

def map[B, That](f: Elem => B)
    (implicit bf: CanBuildFrom[Repr, B, That]): That = {
  val b = bf(this)
  this.foreach(x => b += f(x))
  b.result
}

答案 1 :(得分:1)

使用Insert into table_A(user,id,grade) SELECT table_B.id,table_B.user,'' FROM table_B WHERE table_B.id NOT IN (SELECT table_A.id FROM table_A); ,您尝试将自己的::与Scala标准库List相匹配。如果要使用模式匹配,则需要定义自己的提取器。

您可以在The Neophyte's Guide to Scala Part 1: Extractors中缀操作模式下阅读有关中缀提取器的更多信息。

另一个很好的解释可以在The Scala List extractor demystified找到:

  

事实证明,List::包中)的案例类扩展了scala.collection.immutable。案例类为您提供的许多巧妙的东西之一是一个合成的伴随对象,它具有可以解构该类型实例的unapply方法,