首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以用Java或Scala定义这些类型吗?

我可以用Java或Scala定义这些类型吗?
EN

Stack Overflow用户
提问于 2014-02-09 19:10:58
回答 2查看 112关注 0票数 1

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

然而,在我看来,Integer是一种非常广泛的计算类型。如果我定义不同的更具体的类型-- FactorialFibonacci[Integer] --该怎么办?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-09 19:39:59

我不确定这就是您要寻找的内容,但是如果您有一个自然数的类型级表示(我将在这个答案中使用无形's ),您可以编写一个有意义的Fibonacci类型类,例如:

代码语言:javascript
运行
复制
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(因为它是):

代码语言:javascript
运行
复制
scala> implicitly[Factorial[_7] { type Value = _13 }]
res1: Factorial[shapeless.Nat._7]{type Value = shapeless.Nat._13} = $anon$1@795adafd

但并不是第七个斐波那契数是12:

代码语言:javascript
运行
复制
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中的单例类型的一些讨论,请参见我在这里的博文

票数 4
EN

Stack Overflow用户

发布于 2014-02-09 19:19:02

如果我正确理解你的问题,把这些定义为类型是没有意义的。它们可能应该是函数或方法。像这样

代码语言:javascript
运行
复制
public class MathUtils {
    public static int factorialOf(int n) {
      ...
    }
}

但是,作为一个严格的法律问题,您当然可以创建名为FactorialFibonacci的类,这些类的公共方法可以像上面那样执行这些操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21663627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档