2013-01-02 2 views
3

나는 코드에 다음을하고 난 SML/NJ 사용SML 모듈에서 삽입 연산자를 사용하는 방법은 무엇입니까?

signature STACK= 
sig 

    type 'a Stack 

    val empty :'a Stack 
    val isEmpty : 'a Stack -> bool 

    val cons : 'a*'a Stack -> 'a Stack 
    val head : 'a Stack ->'a 
    val tail : 'a Stack -> 'a Stack 
    val ++ : 'a Stack * 'a Stack -> 'a Stack 
end 
structure List : STACK = 
struct 
infix 9 ++ 
type 'a Stack = 'a list 

val empty = [] 
fun isEmpty s = null s 

fun cons (x,s) = x::s 
fun head s = hd s 
fun tail s = tl s 
fun xs ++ ys = if isEmpty xs then ys else cons(head xs, tail xs ++ ys)  

end 

내가 인터프리터에서 ++ 연산자를 사용하고 싶지만 내가 S1 목록 쓰기 ++ S2 S1과 S2 스택 유형 I. 연산자가 함수가 아니라는 메시지를 얻으십시오.

감사합니다.

답변

3

구조 내부에 ++을 삽입 기호로 선언했으며 그 선언은 구조의 범위 (struct...end)로 제한됩니다. 최상위 레벨에서 중위 어로 선언하거나 접두사로 사용할 수 있지만 SML 중 삽입 어 선언은 서명의 일부가 아닙니다. 몇 가지 흥미로운 해킹에 대한

- List.++ ([1], [2,3]); 
val it = [1,2,3] : int Stack 

- infix 9 ++; 
infix 9 ++ 
- open List; 
... 
- [1] ++ [2,3]; 
val it = [1,2,3] : int Stack 

확인이 아웃 : http://www.mlton.org/InfixingOperators

+0

나는 최상위에있는 구조체의 외부에 넣어하더라도, 내가 시도 할 때 연산자는 함수가 아닙니다 나는 오류 메시지를 가지고 그것을 사용하는 . – Dragno

+0

List 구조체를 열었습니까? 나를 위해 일한 것을 대답으로 편집했습니다. – spacemanaki

+0

목록을 열면 제대로 작동합니다. 그러나 그것은 우리가 최상위 네임 스페이스를 "오염"시킨다는 것을 의미합니까? – Dragno

관련 문제