Одним из вариантов является определение типа (вы все еще можете назвать его Computable), который на данный момент является Int => Int.Используйте его всякий раз, когда вам нужны вычислимые вещи.Вы получите все преимущества наследования от Function1.Тогда, если вы поймете, что вам нужно больше методов, вы можете изменить тип на другую черту.
Сначала:
type Computable = Int => Int
Позже:
type Computable = ComputableTrait // with its own methods.
Один из недостатков этого метода состоит в том, что определенный вами тип на самом деле не является новым типом, а скореепсевдоним.Поэтому, пока вы не измените его на черту, компилятор будет по-прежнему принимать другие функции Int => Int.По крайней мере, вы (разработчик) можете различать.Когда вы переходите на черту (и разница становится важной), компилятор узнает, когда вам нужен Computable, но имеет Int => Int.
Если вы хотите, чтобы компилятор отклонял другие Int => Int -с первого дня, тогда я бы рекомендовал использовать черту, но расширить Int => Int.Когда вам нужно вызвать его, у вас все равно будет более удобный синтаксис.
Другой вариант может состоять в том, чтобы иметь признак и сопутствующий объект с методом apply, который принимает Int => Int и создает Computable изтот.Тогда создание новых Computables будет почти таким же простым, как написание простых анонимных функций, но у вас все равно будет проверка типов (которую вы потеряете при неявном преобразовании).Кроме того, вы можете смешивать черту без проблем (но тогда применение объекта-компаньона не может быть использовано как есть).