私は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#の構文にもっと近い構文がいくつかありますか?
なぜあなたは型共分散を利用したいですか? – asafc
この場合、 'Success [Int]'の型を受け入れるものは 'Failure'のインスタンスを取ります。彼らが 'Option'を実装した方法を見てみましょう。 'None'インスタンスは実際には' caseオブジェクトNoneはOption [Nothing] 'を拡張しています。 – wheaties