加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读