2011-08-15 3 views
4

私はScalaにとって全く新しいです。私はトークン化()メソッドの戻り値の型を宣言する必要はありませんSMLでスカラのケースクラスとリスト

abstract class Token 
case class Zero extends Token 
case class At extends Token 
//... 

object Tokenizer { 
    def tokenize(seq : List[Char]) : List[Token] = seq match { 
    case List() => error("Empty input") 
    case '0' :: rest => Zero :: tokenize(rest) 
    case '@' :: rest => At :: tokenize(rest) 
    //... 
    } 
} 

:今、私はポート私はスカラ座に標準MLに書いたパーサを試みると、次のコードで問題を抱えていますScalaはそれを必要としているようですが、私が提供している型は何となく幸せではありません(ゼロ、Atは無効な型で、代わりに型トークンでなければなりません)。私はまた、構文解析段階の後の時点でトークンリストに一致するようにパテントしたいことに注意してください。

ウェブ上でもstackoverflow自体でも同様の質問が以前に発生していたかどうかを調べましたが(それほど簡単ではありませんでしたが)何とか何も見つかりませんでした。私は何かの基本的な間違っを持っているかなり確信して、私を啓発すること自由に感じなさい:)

答えて

8

あなたはZeroAtケースクラスの新しいインスタンスを作成したい場合は、あなたがそれら(またはnewキーワード:new Zero)をインスタンス化するapplyファクトリメソッドを使用する必要があります。この(スカラZero()では次のようになりますように、ここではその詳細と等しい):あなただけZero(やないZero())を記述する場合

case '0' :: rest => Zero() :: tokenize(rest) 

あなたはコンパイラによって自動的に作成されたZeroクラスのコンパニオンオブジェクトを使用しています。

+0

自分自身がスカラーに慣れていないので、私はなぜそれがコンパイルされないのだろうか?パターンマッチングに(自動的に生成された)コンパニオンオブジェクトを使用できないと言っていますか?もしそうなら、どうしてですか? – Droggl

+1

@Droggl:パターンマッチングで 'Zero'を使用している場合、' Zero.unapply(...) 'メソッドが使用されます(これはケースクラスのコンパニオンオブジェクトに対しても自動的に生成されます) *パターンマッチングで 'Zero'を使います。問題は、コンパニオンオブジェクトが 'Token'クラスを拡張せず、' Zero' **クラス**だけがそれを拡張することです。そして、結果として得られる 'List'のすべての要素は' Token'クラスであると予想されます。 – tenshi

9

AtZeroは、クラスではなくオブジェクトであるので、彼らはTokenのインスタンスそのものではありません。あなたはcase classからcase objectに変更することで、あなたのコードを修正することができます

case object Zero extends Token 
case object At extends Token 

あなたは、関数の戻り値の型を指定する必要がある理由はScalaのコンパイラは、再帰関数の種類を把握することはできませんということです、あなたが読むことができますWhy does Scala require a return type for recursive functions?

+0

ありがとうございますが、 'object'修飾子は' Zero'と 'At'シングルトン型を作っていませんか?私はそれらを複数回インスタンス化したいと思います。 –

+0

はい、それぞれ1つのインスタンスしかありません。しかし、あなたのコードでそれらをインスタンス化しないでください、あなたはオブジェクトとしてそれらを使用するので、私はあなたが望んだものだと思った。さもなければ、 'At'と' Zero'の前に 'new'を貼り付けてください。すべてがうまくいくでしょう(あるいはそれらに'() ')。あるインスタンスを各インスタンスに関連付ける場合を除いて、複数のインスタンスを作成するのは無駄でしょうか? – Theo

+0

あなたは正しいです。私はコードを単純化し、私が持っていた状態の一部を削除しました。申し訳ありません。説明に感謝します。 –

関連する問題