[英]Using functions as applicative functors/cartesians
我正在使用cats
lib。
使用他們的applicative functor實例(或者Cartesian
,准確地)組合兩個列表很容易:
import cats._
import cats.implicits._
(List(23, 4), List(55, 56)).mapN(_ + _)
>> List(78, 79, 59, 60)
但是,我似乎無法用兩個函數做同樣的事情:
val strLength: String => Int = _.length
(strLength, strLength).mapN(_ + _)
>> value mapN is not a member of (String => Int, String => Int)
如果我明確地執行一些隱式轉換,並且如果我創建一個類型別名以給編譯器一個手,它確實有效:
type F[A] = Function1[String, A]
val doubleStrLength = catsSyntaxTuple2Cartesian[F, Int, Int]((strLength, strLength)).mapN(_ + _)
doubleStrLength("hello")
>> 10
有更簡單的方法嗎? 似乎過於冗長
編輯:如果你想玩它,我在這里創建一個工作表: https : //scastie.scala-lang.org/dcastro/QhnD8gwEQEyfnr14g34d9g/2
這僅在您啟用了partial-unification
時才有效。 最簡單的方法是添加sbt-partial-unification
插件 。
如果你使用的是Scala 2.11.9或更高版本,你也可以簡單地添加編譯器標志:
scalacOptions += "-Ypartial-unification"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.