这是对我之前提问的answer的后续跟进。
我们知道仿函数组成。我可以使用List[_]
这样编写仿函数Option[_]
和scalaz
的组合:
import scalaz._, Scalaz._
scala> val flist = Functor[List]
flist: scalaz.Functor[List] = scalaz.std.ListInstances$$anon$1@a5f0295
scala> val foption = Functor[Option]
foption: scalaz.Functor[Option] = scalaz.std.OptionInstances$$anon$1@51e43ad4
scala> flist compose foption
res0: scalaz.Functor[[α]List[Option[α]]] = scalaz.Functor$$anon$1@94c02b
scala> val f = flist compose foption
f: scalaz.Functor[[α]List[Option[α]]] = scalaz.Functor$$anon$1@610bffa0
scala> val os: List[Option[Int]] = Some(1) :: Some(2) :: None :: Nil
os: List[Option[Int]] = List(Some(1), Some(2), None)
scala> f.map(os) {_ + 1}
res1: List[Option[Int]] = List(Some(2), Some(3), None)
使用scalaz
撰写仿函数是否正确?
你能给出一个仿真器组合的现实例子吗?
答案 0 :(得分:1)
假设您有一个字符串列表,其中每个字符串都是一个字符列表。通过编写两个列表仿函数,您可以在字符串列表上获得一个仿函数。现在,您可以将字符上的函数(例如,toUpper或toLower)映射到字符串列表。
这个例子是否足够逼真?: - )
答案 1 :(得分:1)
有关函子组成的更多详细信息,请参见此处:https://www.slideshare.net/pjschwarz/functor-composition
答案 2 :(得分:1)
示例应用函子组成-组合带有列表的选项和包含选项的列表:
有关Functor,Applicative和Monad组成的更多详细信息,请参见此处:https://www.slideshare.net/pjschwarz/monads-do-not-compose