2013-12-05 3 views
2

Scala не позволяет сказать:Почему Scala не разрешает имя параметра в определении типа функции?

def m(f:(numer:Double,denom:Double)=>tan:Double) = {...} 

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

def m(f:(Double,Double)=>Double) = {...} 

Будет ли эта дополнительная гибкость нарушать синтаксис языка?

+1

Как только вы идете по этому маршруту, вам в значительной степени придется поддерживать именованные аргументы. То есть вы должны иметь возможность сказать 'f (number = ..., denom = ...)' или 'f (denom = ..., number = ...)'. Конечно, вы можете это исключить, но это непоследовательно. –

ответ

6

Обходной путь можно найти в использовании псевдонимов типов.

type Numer = Double 
type Denom = Double 
type Tan = Double 
def m(f:(Numer,Denom)=>Tan) = {...} 

Наличие синтаксиса на вашем пути вызывает вопросы и двусмысленность - например, будет ли компилятор проверять, что целевая функция будет иметь одинаковые имена переменных или нет? (подумайте о пользователе, который будет спотыкаться о той функции, которую вы предлагаете)

+0

Но Scala по праву не требует; , и это добавляет 3 строки. Не было бы необходимости, чтобы функция реализации использовала те же имена. Сложность этой функции очень мала по сравнению с общей сложностью языка. Я знаю, одна солома может сломать верблюдов назад ... –

+0

Основная проблема с этим решением заменяет явный тип переменной другим типом, который дает указание на то, что его функция. Две части рядом друг с другом более информативны. –

0

Средство обхода дороги, похожее на om-nom-nom's, может состоять из класса фракций, который состоит из числителя и знаменатель вместе с более описательным именем для f. Что-то вроде:

case class Fraction(numerator: Double, denominator: Double) { ... } 

... 

def doSomething(getTangent: (Fraction) => Double) = { ... } 

Слабость в том, что там ничего не мешает кому-то из проходящих функцию типа (дробь) => Double, который фактически возвращает синус, косинус и т.д. Таким образом, вы можете рассмотреть, вместо getTangent, используя имя trigFunc или что-то в этом роде.

Что касается вашего первоначального предложения, как уже упоминалось, я думаю, что вы не захотите, чтобы реализация функции использовала те же имена параметров, что и в описании типа, поэтому имена параметров в описании типа эффективно комментарии, а не что-либо, что должно быть выполнено компилятором. Таким образом, комментарий scaladoc может служить той же цели.

+0

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

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