我正在尝试创建一个函数,将"SXSXSSSXXX"
形式的字符串映射到instruction list
s [S,X,S,X,S,S,S,X,X,X]
其中
datatype instruction = S | X
type sequence = instruction list
我正在使用map
和String.explode : string -> char list
来实现这一目标:
fun str_to_sequence(s: string) =
map(fn c => if c = #"S" then S else X, String.explode(s))
map的第一个参数是char -> instruction
类型,第二个参数是char list
类型。这匹配map : ('a -> 'b) -> 'a list -> 'b list
的类型签名,其中'a = char
,'b = instruction
,但是,当我尝试编译它时,我得到以下tycon不匹配:
- use "stack_sequences.sml";
[opening stack_sequences.sml]
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[autoloading done]
stack_sequences.sml:5.5-5.62 Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z -> 'Y
operand: (char -> instruction) * char list
in expression:
map ((fn c => if <exp> then <exp> else <exp>),String.explode s)
uncaught exception Error
raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
../compiler/TopLevel/interact/evalloop.sml:44.55
../compiler/TopLevel/interact/evalloop.sml:296.17-296.20
代码有什么问题?我找不到类型不匹配。
答案 0 :(得分:1)
错误报告显示地图的运营商域
'Z -> 'Y
但你的操作数是
(char -> instruction) * char list
所以,你给地图一个元组而不是一个函数。
map
以咖喱形式实施。
您的代码应为
map (fn c => if c = #"S" then S else X) (String.explode s)