scala – 将构造函数作为返回类型
发布时间:2020-12-16 18:57:06 所属栏目:安全 来源:网络整理
导读:在 Scala中,我可以定义一个 Algebraic Data Type: scala sealed trait Maybe[A]defined trait Maybescala case class Just[A](x: A) extends Maybe[A]defined class Justscala case object NothingHere extends Maybe[Nothing]defined object NothingHere
在
Scala中,我可以定义一个
Algebraic Data Type:
scala> sealed trait Maybe[A] defined trait Maybe scala> case class Just[A](x: A) extends Maybe[A] defined class Just scala> case object NothingHere extends Maybe[Nothing] defined object NothingHere 可以使用返回类型Maybe [A]返回函数f. scala> def f[A](x: A): Maybe[A] = Just(x) f: [A](x: A)Maybe[A] 但是,也可以指定返回Just [A]. scala> def f[A](x: A): Just[A] = Just(x) f: [A](x: A)Just[A] 现在我将在Haskell中进行类似的练习: Prelude> data Option a = None | Some a deriving Show Prelude> let f x = Some x :: Option Int Prelude> f 10 Some 10 但是,我无法设置类型构造函数的返回类型. Prelude> let f x = Some x :: Some Int <interactive>:10:21: Not in scope: type constructor or class `Some' A data constructor of that name is in scope; did you mean DataKinds? Prelude> let f x = None :: None Scala的Just是一个类的简单区别,即合法的返回类型吗?然而,在Haskell中,类型构造函数不能是返回类型? 解决方法
不同之处在于Scala如何选择实施ADT. Scala使用以OOP样式扩展特征的case类,因此每个case都是它自己的类型,而Haskell只有多个相同类型的构造函数.由于它们不是单独的类型,而是基本上只是单独的函数,因此您无法在类型级别区分它们.有一些扩展可以让你有一些能够进行类型级别区分的扩展,但它与Scala所具有的不同.试图将Haskell的类型系统融入Scala的类型系统可能不是最好的想法.
简而言之,Scala使用一种继承形式来近似ADT,而Haskell只有ADT. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |