2016-09-09 5 views
3

私はScalaを興味の対象から覚え始めたので、Scott Wlaschinのparser combinatorsパッケージをF#からScalaに翻訳したいと決めました。スタッフが本当に落ち着くでしょう。 Scottのパッケージは実際にはどこでもモナドを使用することです、私はモナドをさらに理解するチャンスとしてこれを見ています。初期のスライドの一つでカスタムタイプをF#からScalaに翻訳する

、彼はタイプtype Parser<'a> = Parser of (string -> Result<'a * string>)を定義し、この定義で

type Result<'a> = 
| Success of 'a 
| Failure of string 

微妙な事はParser<'a>の方程式の両側に'a間の結合です。

いずれにしても、私が言及した繊細さを維持しながら、上記のステートメントをScalaにどのように変換できますか?

私はこの考え最初のものの場合:

type ParserType[T] = String => Result[(T, String)] 

と(選択肢タイプである)は、第2の1のために、私はこの考え:

sealed trait Result[T] 
case class Success[T](result: T) extends Result[T] 
case class Failure[T](msg: String) extends Result[T] 

しかし、それはへの愚かなようですTを一切使用していないため、に[T]を使用してください。 F#の構文にもっと近い構文がいくつかありますか?

答えて

5

しかし、直接あなたの質問に答えるために(、Xorデータ型は猫libにあったことがむき出し。)Scalaの2.12の新右方向バイアスEitherを見てみましょう:

sealed trait Result[+T] 
case class Success[T](result: T) extends Result[T] 
case class Failure(msg: String) extends Result[Nothing] 

を、これは利用していますタイプ共分散。 Failureは、Successと一緒に使用できます。これはmapまたはflatMapの問題を処理しないことに注意してください。

+1

なぜあなたは型共分散を利用したいですか? – asafc

+1

この場合、 'Success [Int]'の型を受け入れるものは 'Failure'のインスタンスを取ります。彼らが 'Option'を実装した方法を見てみましょう。 'None'インスタンスは実際には' caseオブジェクトNoneはOption [Nothing] 'を拡張しています。 – wheaties

関連する問題