Стандартный оператор экспорта ML из структуры как инфикс

Я хотел бы объявить инфиксный оператор в структуре для использования вне структуры. Но я не могу понять, что "нефиксированность" можно распознать вне структуры, даже когда структура была открыта. Вот пример использования Poly/ML:

> structure A = struct infix 6 ++ fun a ++ b = a + b end;
structure A: sig val ++: int * int -> int end
> 1 A.++ 2;
poly: : error: Type error in function application.
   Function: 1 : int
   Argument: A.++ : int * int -> int
   Reason: Value being applied does not have a function type
Found near 1 A.++ 2
Static Errors
> let open A in 1 ++ 2 end;
poly: : error: Type error in function application.
   Function: 1 : int
   Argument: ++ : int * int -> int
   Reason: Value being applied does not have a function type
Found near let open A in 1 ++ 2 end
Static Errors

Это ограничение стандарта ML?

1 ответ

Решение

Да, это не поддерживается Standard ML. Вам придется повторно объявлять фиксированность и, опционально, приоритет каждый раз, когда вы open эта структура. Один из способов обойти это - объявить исправление глобально, т. Е. Вне какой-либо структуры, но это не очень хорошо поддерживается при отдельной компиляции и также не очень модульно. Вы можете прочитать больше об этом и возможном обходном пути на странице InftoningOperators MLton.

Для моих собственных проектов я определил ярлык в моем текстовом редакторе, который будет open декларация, а также исправление.

Кроме того, как личное руководство по стилю, я не объявляю приоритет. Если мне нужно смешать несколько инфиксных операторов в одном выражении, я лучше явно буду использовать скобки. Анализировать идентификатор как инфикс легко, анализ приоритета - нет.

Другие вопросы по тегам