这是关于编程语言中 types 的一个非常基本的问题。现在我使用相同的类型Integer
进行非常不同的计算:例如用于计算阶乘和斐波纳契数。
然而Integer
对我来说似乎是一种非常广泛的类型。如果我定义了不同的特定类型Factorial
或Fibonacci[Integer]
,该怎么办?
这些类型有意义吗?我可以用Java或Scala定义它们吗?
答案 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) {
...
}
}
但作为严格的法律问题,您当然可以创建名为Factorial
和Fibonacci
的类,这些类具有可能执行上述操作的公共方法。