簡體   English   中英

將自定義類型從 F# 轉換為 Scala

[英]Translating custom type from F# to Scala

出於興趣,我開始學習 Scala,我決定將 Scott Wlaschin 的parser combinators包從 F# 翻譯成 Scala,這樣這些東西就會真正安頓下來。 Scott 的包的重點是幾乎在任何地方都使用 monad,所以我我也將其視為進一步了解 monad 的機會。

在早期的一張幻燈片中,他定義了類型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)]

對於第二個(這是一種選擇類型),我想到了這一點:

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

但是,在Failure使用[T]似乎很愚蠢,因為它根本不使用T 是否有一些語法可以更接近於 F# 語法?

看看 Scala 2.12 中新的偏右Either (除此之外,Cats 庫中有一個Xor數據類型。)但是,直接回答你的問題:

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

這利用了類型協方差。 此處的 Any Failure可與任何Success一起使用。 請注意,這不處理mapflatMap問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM