【发布时间】:2015-06-03 14:53:05
【问题描述】:
在 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 中,类型构造函数不能是返回类型?
【问题讨论】:
标签: scala haskell return-type algebraic-data-types type-constructor