試圖將我的思想包圍在Scalaz狀態monad和monad變換器中。Scalaz:將選項狀態轉換爲狀態選項
我想要做的就是實現這樣的:
def transform[S,A](o: State[Option[S], A]) :Option[State[S,A]]
這甚至可能嗎?我會怎麼做?
試圖將我的思想包圍在Scalaz狀態monad和monad變換器中。Scalaz:將選項狀態轉換爲狀態選項
我想要做的就是實現這樣的:
def transform[S,A](o: State[Option[S], A]) :Option[State[S,A]]
這甚至可能嗎?我會怎麼做?
有,你不會喜歡
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狀態),因此您無法做出有用的決定是否應該返回Some
或None
。您可以一直返回None
,或者始終返回Some
,並且State
應用程序有時會失敗。無論你選擇哪一個,結果類型都是無用的。如果None
,轉換函數本身是無用的,如果Some
,鍵入結果作爲Option
帶給你什麼。
是的。這是有道理的。 –
你可以用'Monad'替換'Option',然後用'Monad'替換'State'?然後你有'M1 [M2 [X]]',只需要'M2 [M1 [X]]'。 – wheaties
我不確定我明白這個操作應該做什麼。這裏有一個適用的狀態值:'State((s:Option [String])=>(s,0))'。我們在改造它時會得到什麼? –
請注意,如果['M'有一個'Traverse'實例,'N'有一個應用程序,通常你可以使用'sequence'把'M [N [A]]'變成'N [M [A]]'算符(http://stackoverflow.com/a/12358892/334519)。然而,這在這裏不起作用,因爲'State [_,A]'沒有'Traverse'。 –