Стандартный оператор экспорта 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
декларация, а также исправление.
Кроме того, как личное руководство по стилю, я не объявляю приоритет. Если мне нужно смешать несколько инфиксных операторов в одном выражении, я лучше явно буду использовать скобки. Анализировать идентификатор как инфикс легко, анализ приоритета - нет.