2013-04-01 4 views
1

Все эти функции делают то же самое:Когда разбить аргументы при определении выделанной функции

def h0(f: Int => Int)(g: Int => Int)(x: Int) = f(g(x)) 
def h1(f: Int => Int, g: Int => Int)(x: Int) = f(g(x)) 
def h2(f: Int => Int)(g: Int => Int, x: Int) = f(g(x)) 
def h3(f: Int => Int, g: Int => Int, x: Int) = f(g(x)) 

Сейчас я нахожусь в polylemma: В каком контексте я должен «разделить» аргументы?

ответ

3

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

h0{ i => 
    math.round(math.pow(0.9123751,-i)).toInt 
}{ j => 
    (10*math.sin(j)).toInt 
}(2) 

, то вы должны разделить вещи, как в h0. В противном случае вы можете делать все, что имеет смысл для максимальной ясности. В частности, h2 выше, это плохо, потому что он без видимых причин группирует g и x. Любой из остальных может быть в порядке в зависимости от контекста.

+0

Не могли бы вы пояснить (или указать более подробное объяснение в Интернете) недостаток «застревания с частичным прогрессом к моменту нажатия следующего блока параметров»? И есть ли другие недостатки? – max

+0

@max - Вы можете играть с такими вещами, как 'foo [A, B] (a: A, b: B) (b2: B)' vs. 'foo [A, B] (a: A) (b: B , b2: B) 'где первый тип' B' должен быть выведен, но не совсем соответствует второму (например, 'None' и' Some (1) '. В первом случае он будет знать * что-то * о 'B' и просто прекратить все, что у него есть, и настаивать на том, что' b2' соответствует тому, что уже принято (т.е. 'None.type'). В последнем случае он не знает _anything_ о' B', поэтому он выполняет всю работу во втором блоке параметров (например, он должен быть «Option [Int]»). Нет никаких других недостатков, о которых я знаю. –

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

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