Разделительные аргументы полезны для вывода типа (поскольку компилятор будет проходить через них по одному слева направо, так что вы можете исправить типы слева, не попадая в путаницу справа, но недостаток тогда заключается в том, что если вы ссылаетесь на общий тип, прежде чем вы сможете полностью его вывести, вы застряли с частичным прогрессом к тому времени, когда вы нажмете следующий блок параметров) и для обеспечения скобок вместо скобок. Так что если вы хотите синтаксис как
h0{ i =>
math.round(math.pow(0.9123751,-i)).toInt
}{ j =>
(10*math.sin(j)).toInt
}(2)
, то вы должны разделить вещи, как в h0
. В противном случае вы можете делать все, что имеет смысл для максимальной ясности. В частности, h2
выше, это плохо, потому что он без видимых причин группирует g
и x
. Любой из остальных может быть в порядке в зависимости от контекста.
Не могли бы вы пояснить (или указать более подробное объяснение в Интернете) недостаток «застревания с частичным прогрессом к моменту нажатия следующего блока параметров»? И есть ли другие недостатки? – max
@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]»). Нет никаких других недостатков, о которых я знаю. –