2016-06-08 72 views
0

我使用的是Scala 2.11和Scalaz 7.2.3(最新版)。結合Kleisli使用套折

我在組合Kleisli時遇到了麻煩。我有兩個功能:

type A = ... 
type B = ... 
def set: Set[A] 
def f: A => Kleisli[scalaz.effect.IO, B, Unit] 

val result: Set[Kleisli[scalaz.effect.IO, B, Unit]] = set.map(f(_)) 

但我正在尋找更多的結果作爲Kleisli的組合。事實上,我的類型應該留在Kleisli [scalaz.effect.IO,B,Unit],在相同IO下每個效果堆積如山。

我試過的東西一樣摺疊,例如:

set.fold(Kleisli.???)((acc, a) => acc andThen f(a)) 

,但我無法找到正確的語法,特別是對零Kleisli。

任何幫助,將不勝感激!

編輯:澄清

+0

你的問題是不完全清楚。你想執行'f2'對的'集[A]'所有元素?第一部分有什麼「元素」? –

+0

對不清楚,我會盡力精細化。是的,f需要爲集合[A]中的每個元素執行。 – MMacphail

回答

1

可以使用traverse做到這一點:

val result: Kleisli[IO, B, List[Unit]] = set.toList.traverse(f2) 

我們需要SetList,因爲不存在一個​​(類型類,它爲我們提供了traverse功能)。

如果你想Kleisli[IO, B, Unit]你可以做result.void(這類似於result.map(_ =>())

+0

太棒了!今天學到了新東西!我不完全在我應該的位置,但是這個遍歷函數會很棒=) – MMacphail

+0

你也可以直接用'set.toList.traverse_(f2)'去'Kleisli [IO,B,Unit]'。 –

+0

好吧,即使單元和列表[單元]是相同的,我也會使用它。我想我最初的問題是我無法正確地表達我想要的內容,即:在一個IO操作中將此函數的序列作爲參數B包含在此B中,並且不返回任何內容。 – MMacphail