2016-08-26 32 views
1

我很好奇這樣做的正確方法。假設我想通過某種方法表示成功或失敗。這是否可以接受,如果在成功的情況下我不想說什麼,除了成功?Scala或者單元

def fn(): Either[Throwable, Unit] 

什麼是從這種方法返回一個Right()成功的正確方法?顯然只是返回Right()給出了棄用警告(通過插入()適應參數列表已被棄用)。

我也可以做選項[Throwable],但這並不符合我如何閱讀Option的精神。或者可能返回scala.util.Try的結果並評估成功/失敗?

- 關於棄用警告,僅供參考。

Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101). 
Type in expressions for evaluation. Or try :help. 

scala> def fn:Either[Throwable, Unit] = { Right() } 
<console>:11: warning: Adaptation of argument list by inserting() has been deprecated: this is unlikely to be what you want. 
     signature: Right.apply[A, B](b: B): scala.util.Right[A,B] 
    given arguments: <none> 
after adaptation: Right((): Unit) 
     def fn:Either[Throwable, Unit] = { Right() } 
              ^
fn: Either[Throwable,Unit] 
+2

我想'在這種情況下嘗試[T]'是完全有意義的。 –

+1

但嘗試將錯誤處理/恢復移到調用者。如果被調用者可以恢復,我寧願將它保留在被調用者中,只有在不能恢復時才返回失敗。所以他們不完全等同。 –

回答

1

我會說這取決於你正在尋找的API的種類。

def fn(): Either[Throwable, Unit]聽起來很不符合我的習慣。如果您期望該功能的主要結果是副作用,那麼在使用Either時似乎沒有用處。這是否是因爲它是一個monadic操作鏈的終端操作?

這幾天變得不那麼流行,也不那麼慣用,但我可能會用Try[A]去處理那裏的情況。另一種慣用的選擇是,而不是在你的Either中洗牌例外,以創建所有錯誤類型的密封特徵層次結構,並返回有效函數的結果,而不是原始Throwable實例。

在REPL處撥打Right()Right(())時,我看不到您記錄的錯誤,您正在使用什麼版本的scalac

+1

'Right()'至少在2.11.8中發出警告。你的意思是'嘗試[單位]'不太受歡迎?或者「嘗試[任何]」?我讀過不喜歡的人試試。就像OP一樣,我對'嘗試[Unit]'有所忌憚,但是'Option [Throwable]'引起了我的興趣,這是一種罪惡:'嘗試(???)。恢復{case e => e} .toOption' –

+0

@ som-snytt但你如何推斷​​錯誤消息日誌? –

+0

我在原始帖子中添加了棄用警告。是的,我對Try()的猶豫是,很多人似乎並不喜歡它。我並沒有聲稱我明白爲什麼,它可能是一些數學證明它們是正確的。也僅僅是列出我的原始用例,我正在包裝一個事件創建,可能會在構建過程中拋出一個異常(由於Java API的使用)但否則不會返回任何有趣的內容。 –

2

您可以使用Unit作爲類型並返回()

def fn(): Either[Throwable, Unit] = Right(())