我可以在Java或Scala中定义这些类型吗?

时间:2014-02-09 19:10:59

标签: java scala types

这是关于编程语言中 types 的一个非常基本的问题。现在我使用相同的类型Integer进行非常不同的计算:例如用于计算阶乘和斐波纳契数。

然而Integer对我来说似乎是一种非常广泛的类型。如果我定义了不同的特定类型FactorialFibonacci[Integer],该怎么办?

这些类型有意义吗?我可以用Java或Scala定义它们吗?

2 个答案:

答案 0 :(得分:4)

我不确定这是你在找什么,但如果你有一个自然数字的类型级表示(我将在这个答案中使用Shapeless),你可以写像这样有意义的Fibonacci类型类,例如:

import shapeless._, Nat._

trait Factorial[N <: Nat] { type Value <: Nat }

implicit object fact0 extends Factorial[_0] { type Value = _0 }
implicit object fact1 extends Factorial[_1] { type Value = _1 }

implicit def factN[N <: Nat, X <: Nat, Y <: Nat, Z <: Nat](implicit
  nf: Factorial[N]       { type Value = X },
  sf: Factorial[Succ[N]] { type Value = Y },
  sum: ops.nat.Sum.Aux[X, Y, Z]
) = new Factorial[Succ[Succ[N]]] { type Value = Z }

然后我可以要求类型系统证明第七个Fibonacci数是十三(因为它是):

scala> implicitly[Factorial[_7] { type Value = _13 }]
res1: Factorial[shapeless.Nat._7]{type Value = shapeless.Nat._13} = $anon$1@795adafd

但不是第七个斐波纳契数是十二:

scala> implicitly[Factorial[_7] { type Value = _12 }]
<console>:23: error: could not find implicit value for parameter e: Factorial[shapeless.Nat._7]{type Value = shapeless.Nat._12}
              implicitly[Factorial[_7] { type Value = _12 }]
                        ^

此方法使用自然数的Church encoding。您还可以在Scala 2.10中使用带有宏的单例类型 - 例如参见my blog post here,以了解Scala中单例类型的一些讨论。

答案 1 :(得分:1)

如果我正确理解你的问题,将它们定义为类型是没有意义的。它们应该是功能或方法。喜欢这个

public class MathUtils {
    public static int factorialOf(int n) {
      ...
    }
}

但作为严格的法律问题,您当然可以创建名为FactorialFibonacci的类,这些类具有可能执行上述操作的公共方法。