为什么我不能运行这样的scala代码? (reduceRight List类方法)

时间:2018-06-07 20:42:13

标签: scala list methods

我的代码:

import QtQuick 2.11
import QtQuick.Window 2.11
import QtQuick.XmlListModel 2.0

Window {
    visible: true
    width: 640
    height: 480

    XmlListModel {
        id: videoListModel
        source: "https://www.youtube.com/feeds/videos.xml?channel_id=UCupvZG-5ko_eiXAupbDfxWw"
        query: "/feed/entry"
        XmlRole { name: "title"; query: "title/string()" }
    }

    ListView {
        orientation: ListView.Vertical
        anchors.top: parent.top

        model: videoListModel

        delegate: Component {
            id: videoDelegate
            Text {
                text: title
                width: 200
                height: 50
            }
        }
    }
}

我的错误:

  

模式类型与预期类型不兼容,dound:Nil.type,   必需:列出[T]

我是Scala的新手,所以,请描述一下你的答案。

1 个答案:

答案 0 :(得分:1)

tldr:将您的类命名为其他名称,让该方法接受第二个参数,即您要减少的List。

问题是您将类List命名为Scala中类的名称。它本身实际上并不会破坏代码,但它可能会导致您对Scala List或自定义List是否意味着混淆。

然后您混淆了它并尝试使用您的自定义类,就像它是常规Scala List一样。特别是尝试使用与Nil::等内容进行模式匹配。这些仅适用于Scala List,而非您的自定义。您当然也可以为那些使用自定义List的代码编写代码,但是您仍然需要小心确定您所指的是哪一个,如果您选择这条路线,我建议您使用不同的名称。

更简单的解决方案是将类命名为其他内容,然后将Reduce更改为右侧,同时将常规List作为参数。像这样:

abstract class MyClass {
  def reduceRight[T](list: List[T], op: (T, T) => T): Either[String, T] = list match {