在Haskell,我可以做以下字符串應用的函數列表使用Scala的貓重視
let f = sequence [id, reverse]
f "test"
我在一個小的損失如何使用貓在一個更好的方法處理這個。我目前有類似的東西
val f = List(fun1,fun2)
val data = "test"
f map {fun => fun(data)}
是否有序列或SequenceU的實現可以使用貓做到這一點?
在Haskell,我可以做以下字符串應用的函數列表使用Scala的貓重視
let f = sequence [id, reverse]
f "test"
我在一個小的損失如何使用貓在一個更好的方法處理這個。我目前有類似的東西
val f = List(fun1,fun2)
val data = "test"
f map {fun => fun(data)}
是否有序列或SequenceU的實現可以使用貓做到這一點?
它或多或少完全一樣,只是語法稍有不同,您需要一些額外的導入,並且通用版本不太方便,因爲Scala的String
不僅僅是一個字符列表的別名:
import cats.instances.function._, cats.instances.list._, cats.syntax.traverse._
val funcs: List[String => String] = List(identity, _.reverse)
val f = funcs.sequenceU
在Haskell sequence
需要其自變量的外類型構造,和用於內類型構造一個Monad
實例的Traversable
實例。貓的sequence
幾乎各項─Traversable
被稱爲Traverse
(因爲名字Traversable
已經採取的標準庫),它需要一個Applicative
實例,而不是Monad
(這是一個更準確的約束Haskell的sequence
只需要一個單子實例歷史原因)。
如果你想要,你可以只導入cats.implicits._
,但這會帶來很多其他的東西。上面的導入提供了所需的最小類型類實例和語法擴展。
您可以使用f
,這是一個String => List[String]
,像這樣:
scala> f("test")
res0: List[String] = List(test, tset)
請注意,如果你在2.12.1和啓用了-Ypartial-unification
編譯器標誌,你可以只寫.sequence
,不.sequenceU
。爲什麼在早期的Scala版本中需要U
是一個漫長的故事 - 請參閱我的blog post here以獲取解釋。