2013-12-19 90 views
1

試圖將我的思想包圍在Scalaz狀態monad和monad變換器中。Scalaz:將選項狀態轉換爲狀態選項

我想要做的就是實現這樣的:

def transform[S,A](o: State[Option[S], A]) :Option[State[S,A]] 

這甚至可能嗎?我會怎麼做?

+0

你可以用'Monad'替換'Option',然後用'Monad'替換'State'?然後你有'M1 [M2 [X]]',只需要'M2 [M1 [X]]'。 – wheaties

+0

我不確定我明白這個操作應該做什麼。這裏有一個適用的狀態值:'State((s:Option [String])=>(s,0))'。我們在改造它時會得到什麼? –

+0

請注意,如果['M'有一個'Traverse'實例,'N'有一個應用程序,通常你可以使用'sequence'把'M [N [A]]'變成'N [M [A]]'算符(http://stackoverflow.com/a/12358892/334519)。然而,這在這裏不起作用,因爲'State [_,A]'沒有'Traverse'。 –

回答

3

有,你不會喜歡

def transform[S,A](o: State[Option[S], A]: Option[State{S,A]] = None 

如果你嘗試另一種實現方式是合法的實現,問題是什麼時候可以改變返回一些? State[Option[S], A]Option[S] => (Option[S], A)。你正試圖得到一個S => (S,A)。 鑑於s: S,您必須返回一個(S,A)對。將s傳遞到原始狀態是可以的,只需將它包裝在Some中即可。但是,您得到的(Option[S], A)可能缺少S。沒有辦法將其轉換爲(S,A)。除非您接受該州有時會失敗。

您無法事先知道o永遠不會返回None狀態(即使您在給定某個狀態時進一步限制爲不返回None狀態),因此您無法做出有用的決定是否應該返回SomeNone。您可以一直返回None,或者始終返回Some,並且State應用程序有時會失敗。無論你選擇哪一個,結果類型都是無用的。如果None,轉換函數本身是無用的,如果Some,鍵入結果作爲Option帶給你什麼。

+0

是的。這是有道理的。 –