这是关于编程语言中类型的一个非常基本的问题。现在,我使用相同类型的Integer
进行非常不同的计算:例如,计算阶乘数和fibonacci数。
然而,在我看来,Integer
是一种非常广泛的计算类型。如果我定义不同的更具体的类型-- Factorial
或Fibonacci[Integer]
--该怎么办?
这样的类型有意义吗?我可以用Java或Scala来定义它们吗?
发布于 2014-02-09 19:39:59
我不确定这就是您要寻找的内容,但是如果您有一个自然数的类型级表示(我将在这个答案中使用无形's ),您可以编写一个有意义的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 }
然后,我可以要求类型系统证明,例如,第七个斐波那契数是13(因为它是):
scala> implicitly[Factorial[_7] { type Value = _13 }]
res1: Factorial[shapeless.Nat._7]{type Value = shapeless.Nat._13} = $anon$1@795adafd
但并不是第七个斐波那契数是12:
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 }]
^
这种方法使用自然数的教会编码。您还可以在Scala2.10中使用单例类型和宏--例如,有关Scala中的单例类型的一些讨论,请参见我在这里的博文。
发布于 2014-02-09 19:19:02
如果我正确理解你的问题,把这些定义为类型是没有意义的。它们可能应该是函数或方法。像这样
public class MathUtils {
public static int factorialOf(int n) {
...
}
}
但是,作为一个严格的法律问题,您当然可以创建名为Factorial
和Fibonacci
的类,这些类的公共方法可以像上面那样执行这些操作。
https://stackoverflow.com/questions/21663627
复制相似问题