gpt4 book ai didi

scala - 是否有一个函数可以分别采用两个变换函数来变换/映射 Either 的 Left 和 Right 情况?

转载 作者:行者123 更新时间:2023-12-05 08:16:55 26 4
gpt4 key购买 nike

我还没有在 Scala 或 Haskell 中找到可以转换/映射 EitherLeftRight 两个转换的函数同时运行,即一个类型为

的函数
(A => C, B => D) => Either[C, D]

对于 Either[A, B] 在 Scala 中,或者类型

(a -> c, b -> d) -> Either a b -> Either c d

在 Haskell 中。在 Scala 中,这相当于像这样调用 fold:

def mapLeftOrRight[A, B, C, D](e: Either[A, B], fa: A => C, fb: B => D): Either[C, D] =
e.fold(a => Left(fa(a)), b => Right(fb(b)))

或者在 Haskell 中,这相当于像这样调用 either:

mapLeftOrRight :: (a -> c) -> (b -> d) -> Either a b -> Either c d
mapLeftOrRight fa fb = either (Left . fa) (Right . fb)

库中有这样的函数吗?如果没有,我觉得这样的东西很实用,为什么语言设计者选择不把它放在那里?

最佳答案

不知道 Scala,但 Haskell 有一个类型签名的搜索引擎。它不会为您编写的结果提供结果,但这只是因为您采用了一个元组参数,而 Haskell 函数按照惯例是 curriedhttps://hoogle.haskell.org/?hoogle=(a -> c) -> (b -> d) -> Either a b -> Either c d确实匹配,最明显的是:

<a href="https://hackage.haskell.org/package/either/docs/Data-Either-Combinators.html#v:mapBoth" rel="noreferrer noopener nofollow">mapBoth</a> :: (a -> c) -> (b -> d) -> Either a b -> Either c d

...实际上,即使谷歌也发现了这一点,因为类型变量恰好与您想象的完全一样。 (Hoogle 也找到了它 if you write it (x -> y) -> (p -> q) -> Either x p -> Either y q 。)

但实际上,正如 Martijn 所说,Either 的这种行为只是 双仿函数 的特例,实际上 Hoogle 还为您提供了更一般的形式,即在 base 库中定义:

<a href="https://hackage.haskell.org/package/base/docs/Data-Bifunctor.html#v:bimap" rel="noreferrer noopener nofollow">bimap</a> :: Bifunctor p => (a -> b) -> (c -> d) -> p a c -> p b d

TBH 我有点失望的是 Hoogle 本身并没有想出柯里签名或交换参数。很确定它实际上曾经自动执行此操作,但在某些时候他们简化了算法,因为由于库数量巨大,它花费的时间和结果的数量失控了。

关于scala - 是否有一个函数可以分别采用两个变换函数来变换/映射 Either 的 Left 和 Right 情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63484238/

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