В Scala я могу определить алгебраический тип данных:
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
Является ли простая разница в том, что Just
в Scala является классом, то есть допустимым типом возвращаемого значения? Принимая во внимание, что в Haskell конструктор типа не может быть возвращаемым типом?