[英]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
一起使用。 請注意,這不處理map
或flatMap
問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.