在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