在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
这是可能的返回功能,f
,与Maybe[A]
返回类型。
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中,类型的构造函数不能是返回类型吗?
有扩展给你_similar_的能力,但是非常重要的是Haskell没有子类化,所以你肯定不能做同样的事情.. .. – leftaroundabout
@leftaroundabout改变了一下措辞,使它更清楚我是指的是可以让您在类型级别区分构造函数的扩展,但这不是Scala所具有的。认为它现在更清楚了吗? – bheklilr