问题
I have the following to code and I use SML/NJ:
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
I want to use the ++ operator from the interpreter but when I write s1 List.++ s2 where s1 and s2 stack types I get the message that operator is not a function.
Thanks.
回答1:
You've declared ++
as infix inside the structure, and that declaration is restricted to the scope of the structure (inside struct...end
). You can declare it as infix at the top-level, or use it as prefix, but in SML infix declarations aren't part of the signature.
- 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
Check this out for some interesting hacks: http://www.mlton.org/InfixingOperators
来源:https://stackoverflow.com/questions/14128799/how-to-use-infix-operator-from-a-sml-module