gpt4 book ai didi

scala - `A => List[B]` 可以转换为 `List[A => B]` 吗?

转载 作者:行者123 更新时间:2023-12-02 16:21:08 25 4
gpt4 key购买 nike

我正在尝试为这个 Scala 函数签名找到一个实现:

def explode[A, B](f: A => List[B]): List[A => B]

相反的方向是可能的:

def nest[A, B](fs: List[A => B]): A => List[B] = (a: A) => fs.map(_(a))

现在我倾向于相信第一个 (explode) 是无法实现的,但我很高兴被证明是错误的。如果确实无法实现,背后是否有深层次的原因?

在我看来,我实际上是在要求编译器“复制”输入 A 一些 n 次(List 的大小) ,并将其“修复”为输入。

最佳答案

In my view, I am essentially asking the compiler to "duplicate" that input A some n times (the Lists size), and "fix" it as input.

问题是您不知道n 是什么。例如,考虑一个函数返回一个数的所有质因数的列表:

def divisors(n: Int): List[Int] = ???

您期望 explode(divisors) 是什么? divisors 可以返回任意大小的 List,具体取决于它的参数,无论何时在将来调用它。但是当您调用 explode 时,它必须立即返回一个固定大小的 List

给定一个固定类型A,你代码中的签名可以这样写:

type F[T] = List[T]
type G[T] = A => T

def nest[B]: F[G[B]] => G[F[B]]
def explode[B]: G[F[B]] => F[G[B]]

nestexplode 让人想起 sequence手术。它适用于 nest,因为可以编写 Traverse List 的实例,但不可能为函数A => T 编写Traverse 实例。这是一个等效的 question for Haskell ,这提供了更多见解。

关于scala - `A => List[B]` 可以转换为 `List[A => B]` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65454714/

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