gpt4 book ai didi

scala - 为什么 `Left` 和 `Right` 有两个类型参数?

转载 作者:行者123 更新时间:2023-12-04 04:24:40 24 4
gpt4 key购买 nike

我知道现在很难在不破坏现有代码的情况下进行更改,但我想知道为什么首先要这样做。
为什么不只是:

sealed trait Either[+A, +B]
case class Left[A](x: A) extends Either[A, Nothing]
case class Right[B](x: B) extends Either[Nothing, B]
这里是否有一些我没有看到的缺点......?

最佳答案

不确定这个答案与 Scala 有多大关系,但它肯定是在 Haskell 中,这显然是 Scala 的 Either是借来的,所以这可能是 Scala 这样做的最好的历史原因。Either是规范的 coproduct ,即对于任何类型 AB你有

  • 型号EitherA,B ≈ A ⊕ B
  • 两个共同投影LeftA,B : A -> A⊕BRightA,B : B -> A⊕B
  • 这样对于任何类型 Y和任何功能 fA : A -> YfB : B -> Y ,只存在一个函数 f : A⊕B -> Y具有 fA = f ∘ LeftA,B 的属性和 fB = f ∘ RightA,B .

  • 要在数学上表述这一点,拥有特定 Left 的信息是非常有帮助的。您正在使用显式,因为否则态射的域将全部不清楚。在 Scala 中,由于隐式协变转换,这可能是不必要的,但在数学和 Haskell 中不是。
    在 Haskell 中,这根本不是问题,因为类型推断会自动执行所需的操作:
    GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
    Loaded GHCi configuration from /tmp/haskell-stack-ghci/2a3bbd58/ghci-script
    Prelude> let right2 = Right 2
    Prelude> let left42 = Left 42.0
    Prelude> (+) <$> right2 <*> left42
    Left 42.0
    显然,在 Scala 中,Haskell 只留下了 left42 未指定的第二个参数。作为类型变量(除非启用了单态限制),因此您以后可以在任何需要一些 Either Double R 的上下文中使用它适用于任何类型 R .当然也可以明确表示
    right2 :: Either a Int
    right2 = Right 2

    left42 :: Either Double a
    left42 = Left 42

    main :: IO ()
    main = print $ (+) <$> right2 <*> left42
    这在 Scala 中当然也是可能的。

    关于scala - 为什么 `Left` 和 `Right` 有两个类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64656786/

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