2014-10-11 1 views
5

Я пытаюсь создать тип «целочисленный mod p» в Julia. (Я уверен, что уже есть пакет для этого, это просто личных упражнений.)Ссылка на параметр типа как параметр функции в Julia

type Intp{p} 
    v::Int8 
end 

function add(a::Intp{p},b::Intp{p}) 
    return Intp{p}((a.v + b.v) % p) 
    end 

Я получаю сообщение об ошибке при определении надстройки, которая говорит р не определен. Как ссылаться на p изнутри?

. (Примечание: я мог бы сделать что-то вроде

type Intp 
    v::Int8 
    p 
end 

function add(a::Intp,b::Intp) 
    return Intp((a.v + b.v) % a.p,p) 
    end 

, но это потребовало бы, что р храниться с каждым номером я чувствую, что это было бы неэффективно, и у меня есть свое мнение на обобщениях, где это было бы быть действительно неэффективным.Я предпочел бы, чтобы p просто указывался один раз для типа и ссылался на функции, которые воспринимают вещи такого типа как аргументы.)

ответ

7

Ваш первый пример очень близок, но вам нужно включить между имя метода и подпись:

function add{p}(a::Intp{p},b::Intp{p}) 
    return Intp{p}((a.v + b.v) % p) 
end 

В противном случае, вы пишете метод для пары Intp{p} значений, где p является то, что текущее конкретное значение p может быть - что, в вашем случае, бывает, не было никакого значения, следовательно, сообщение об ошибке. Таким образом, общая подпись методы Юлия является:

  1. имя метода
  2. параметры типа в { } (по желанию)
  3. аргументов в ()
+1

Спасибо Стефана. Мне нравится ваш язык. –

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

  • Нет связанных вопросов^_^