2017-10-04 30 views
4

我正在使用cats lib。使用函數作爲應用函數/笛卡爾

這是很容易利用其適用函子實例(或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

回答

5

這隻能如果已經啓用了partial-unification。 最簡單的方法是添加sbt-partial-unificationplugin

如果你在斯卡拉2.11.9或更新的版本,你也可以簡單地添加編譯標誌:

scalacOptions += "-Ypartial-unification" 
+1

啊,就是這樣!我記得前一陣子聽說過Miles正在做這件事。我想我現在太習慣於haskell了。謝謝! – dcastro