更好地理解错误

时间:2012-10-04 21:50:00

标签: sml smlnj

我是SML的初学者。这很容易,但需要几个小时,但我无法解决它。

我必须获取一个字符串列表并反转每个字符串以及列表。并且在不在主要部分之外定义多个功能的情况下执例如[“stack”,“overflow”,“nice”]会给[“ecin”,“wolfrevo”,“kcats”]

fun oppositelist(l)=foldl (op::) nil (map ((fn(x)=>(implode o rev o explode)(x)), l));

,错误信息为:

Error: operator and operand don't agree [tycon mismatch]
  operator domain: 'Z -> 'Y
  operand:         (string -> string) * 'X
  in expression:
    map ((fn x => <exp> <exp>),l)

如果方法错误,请不要解决所有问题。提示它。这是一个家庭作业问题。

谢谢。

1 个答案:

答案 0 :(得分:1)

SML函数mapcurried。要在列表f的每个元素上映射函数l,您必须编写map f l。你写的是map (f,l),这意味着“将函数(f,l)映射到...稍后要确定的东西。”编译器抱怨你,因为(f,l) 不是一个函数('Z -> 'Y);它是一个由函数和列表组成的元组((string -> string) * 'X)。

我没有仔细查看你的解决方案,但如果你回答这个问题并且问我,我可能会。 :)

编辑:哦,而(fn(x)=>(implode o rev o explode)(x))只是一种冗长的撰写(implode o rev o explode)的方式,原因与编写(fn(x)=>f(x))是一个很长的啰嗦的写作方式f