2014-02-09 4 views
1

Это очень простой вопрос о типах в языках программирования. Теперь я использую тот же тип Integer для самых разных вычислений: например. для расчета как факториалов, так и числа фибоначчи.Могу ли я определить эти типы в Java или Scala?

Однако Integer мне очень широк для этих вычислений. Что делать, если я определяю другое другое типы Factorial или Fibonacci[Integer] вместо этого?

Имеют ли такие типы смысл? Могу ли я определить их на Java или Scala?

+0

В чем смысл? –

+0

Я имею в виду: _Do такие типы имеют смысл? _/Редактирование вопроса/ – Michael

+1

Конечно, вы можете определить пользовательские типы на любом языке. Так что не совсем понятно, что вы просите. –

ответ

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 } 

Тогда я могу попросить систему типа, чтобы доказать, например, что седьмое число Фибоначчи тринадцать (потому что):

scala> implicitly[Factorial[_7] { type Value = _13 }] 
res1: Factorial[shapeless.Nat._7]{type Value = shapeless.Nat._13} = [email protected] 

Но не о том, что седьмое число Фибоначчи - двенадцать:

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.

+0

Отлично! Благодарю.Теперь мне есть над чем подумать! – Michael

1

Если я правильно понял ваш вопрос, было бы нецелесообразно определять их как типы. Вероятно, они должны быть функциями или методами. Как это

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

Но как сугубо юридический вопрос, вы, конечно, можете создавать классы, называемые Factorial и Fibonacci, которые имеют открытые методы, которые предположительно выполняют эти операции, как показано выше.

Смежные вопросы