gpt4 book ai didi

scala - 组合两个函数得到一个返回 HList 的函数

转载 作者:行者123 更新时间:2023-12-04 17:46:47 25 4
gpt4 key购买 nike

这可能是一个关于 shapeless 的非常幼稚的问题:

假设我有函数 A => M[B]B => M[C] .如何组合它们以获得新功能 A => M[B::C::HNil] ?

最佳答案

如果您想一般地执行此操作,您可以使用 Scalaz 的 Arrow :

import scalaz._, Scalaz._

def andThenButKeep[Arr[_, _]: Arrow, A, B, C](
f: Arr[A, B],
g: Arr[B, C]
): Arr[A, (B, C)] = f >>> (Category[Arr].id &&& g)

或者,如果您想要 HList而不是元组:
import scalaz._, Scalaz._
import shapeless._, shapeless.syntax.std.tuple._

def andThenButKeep[Arr[_, _], A, B, C](
f: Arr[A, B],
g: Arr[B, C]
)(implicit Arr: Arrow[Arr]): Arr[A, B :: C :: HNil] =
f >>> (Arr.id &&& g) >>> Arr.arr((_: (B, C)).productElements)

现在,您可以将函数包装在 Kleisli 箭头中:
type OptionFunc[A, B] = Kleisli[Option, A, B]

val f: OptionFunc[Int, String] = Kleisli(i => Some("a" * i))
val g: OptionFunc[String, Int] = Kleisli(s => Some(s.length))

val c = andThenButKeep(f, g)

进而:
scala> println(c.run(10))
Some(aaaaaaaaaa :: 10 :: HNil)

您可以通过将箭头限制为您的 M 上的 Kleisli 箭头来减少对类型推断(但也不太通用)的关注。 .

关于scala - 组合两个函数得到一个返回 HList 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31587975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com