2014-02-10 3 views
0

У меня есть следующий код:Уменьшить шаблонный с функцией составом

def a = f(aa) 
def b = f(bb) 
def c = f(cc) 
def d = f(dd) 

Есть ли решение для удаления шаблонного, т.е. явного вызов f

+1

мне было бы интересно узнать, почему вы считаете его шаблоном. Как вы могли бы написать это более кратким или более четким способом? Вскоре люди найдут, что ключевое слово 'def' является шаблоном! : -P –

+0

Поскольку один и тот же шаблон (вызов f) появляется несколько раз, но я согласен, это всего лишь несколько шаблонов, и, возможно, это невозможно сделать лучше. –

ответ

6

Вы можете сделать что-то подобное со стандартной библиотекой:

val List(a,b,c,d) = List(aa,bb,cc,dd).map(f) 

Он использует сопоставление с образцом для присвоения значений слева, что не будет выполнено во время выполнения, если два List s имеют одинаковую длину.

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

import scalaz._, Scalaz._ 
val (a,b,c,d) = (aa,bb,cc,dd).map(f) 
+0

'val Список (a, b, c, d) = Список (aa, bb, cc, dd) .map (f) 'не является leazy решением, все a, b, c, .. будут выполняться в то же время, но' def a = f (aa) 'и' def b = f (bb) 'будет выполняться в момент его вызова. – Yuriy

+0

Когда я заменяю стандартное решение решением scalaz, я получил ошибку компиляции: [ошибка] conf/routes: 49: недостаточно аргументов для метода: (n: Int) models.EventType.Value в признаке LinearSeqOptimized. [ошибка] Неопределенный параметр значения n. –

+0

Юрий: правда, и это будет проблемой, если 'f' имеет побочные эффекты. Я не могу придумать ничего подобного, что бы обойти это. Янн: У меня недостаточно контекста для диагностики проблемы с решением scalaz. –

1

Вы можете использовать неявный: http://docs.scala-lang.org/overviews/core/implicit-classes.html

val aa: Int = 1 

// Let's say that your function f returns instance of C 
def f(x: Int): C = ??? 

implicit class C(in: Int) { 
    // Do whatever you need here ... 
} 

def a: C = aa 
+0

aa на самом деле является функцией, вот определение f: 'def f [A: Reads, B: Writes] (g: A => B)' –

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