2017-01-26 48 views
4

在Haskell,我可以做以下字符串應用的函數列表使用Scala的貓重視

let f = sequence [id, reverse] 
f "test" 

我在一個小的損失如何使用貓在一個更好的方法處理這個。我目前有類似的東西

val f = List(fun1,fun2) 
val data = "test" 

f map {fun => fun(data)} 

是否有序列或SequenceU的實現可以使用貓做到這一點?

回答

5

它或多或少完全一樣,只是語法稍有不同,您需要一些額外的導入,並且通用版本不太方便,因爲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以獲取解釋。

相關問題