在SML tycon不匹配中映射

时间:2013-10-13 20:04:19

标签: types functional-programming sml

我正在尝试创建一个函数,将"SXSXSSSXXX"形式的字符串映射到instruction list s [S,X,S,X,S,S,S,X,X,X]其中

datatype instruction = S | X
type sequence = instruction list

我正在使用mapString.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

代码有什么问题?我找不到类型不匹配。

1 个答案:

答案 0 :(得分:1)

错误报告显示地图的运营商域

'Z -> 'Y

但你的操作数是

(char -> instruction) * char list 

所以,你给地图一个元组而不是一个函数。

map以咖喱形式实施。

您的代码应为

map (fn c => if c = #"S" then S else X) (String.explode s)