簡體   English   中英

使用函數作為applicative functor / cartesians

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM