Sml 为什么运算符和操作数的类型不匹配?

Sml 为什么运算符和操作数的类型不匹配?,sml,smlnj,Sml,Smlnj,为什么存在tycon不匹配运算符和操作数不一致错误?有什么解决办法的建议吗 fun reve (x:string) = implode o rev o explode x 问题在于,函数应用程序绑定比o更强 也就是说,它被解释为: fun reve x = implode o rev o (explode x); 由于explode x是一个char list而不是一个函数,因此此操作将失败 您可以通过正确放置括号来解决此问题 fun reve x = (implode o rev o ex

为什么存在tycon不匹配运算符和操作数不一致错误?有什么解决办法的建议吗

fun reve (x:string) = implode o rev o explode x

问题在于,函数应用程序绑定比
o
更强

也就是说,它被解释为:

fun reve x = implode o rev o (explode x);
由于
explode x
是一个
char list
而不是一个函数,因此此操作将失败

您可以通过正确放置括号来解决此问题

fun reve x = (implode o rev o explode) x;
或者用无点符号书写:

val reve = implode o rev o explode
还可以定义一个右关联函数应用程序运算符,通常称为
$
,该运算符不带括号即可执行所需操作:

(* Right-associative function application *)
infixr $
fun f $ x = f x;

fun reve x = implode o rev o explode $ x