Sml 使用用户定义的数据类型作为函数参数的类型

Sml 使用用户定义的数据类型作为函数参数的类型,sml,smlnj,Sml,Smlnj,我定义了以下数据类型: datatype Arguments = IntPair of int * int | RealTriple of real * real * real | StringSingle of string; datatype OutputArgs = IntNum of int | RealNum of real | Str of string; 我尝试创建一个函数MultiFunc:Arguments->OutputArgs: 但是,当我调用MultiFu

我定义了以下数据类型:

datatype Arguments
  = IntPair of int * int
  | RealTriple of real * real * real
  | StringSingle of string;

datatype OutputArgs = IntNum of int | RealNum of real | Str of string;
我尝试创建一个函数MultiFunc:Arguments->OutputArgs:

但是,当我调用MultiFunc1.0,2.0,3.0时,会出现以下错误:

stdIn:588.1-588.23 Error: operator and operand don't agree [tycon mismatch]
  operator domain: Arguments
  operand:         real * real * real
  in expression:
    MultiFunc (1.0,2.0,3.0)

也就是说,由于某些原因,它无法将输入参数识别为RealTriple。

您需要将三元组包装到相应的数据构造函数中,以便向编译器解释,您指的是类型参数,而不仅仅是实数的三元组:

MultiFunc (RealTriple (1.0,2.0,3.0))

您需要将三元组包装到相应的数据构造函数中,以便向编译器解释您指的是类型参数,而不仅仅是实数的三元组:

MultiFunc (RealTriple (1.0,2.0,3.0))
出于某种原因,它无法将输入参数识别为RealTriple

这是因为输入不是RealTriple,而是reals real*real*real的3元组

请尝试:

- MultiFunc (RealTriple (1.0, 2.0, 3.0));
> val it = RealNum 2.0 : OutputArgs
下面是我编写函数的方法:

fun multiFunc (RealTriple (x, y, z)) = RealNum ((x+y+z)/3.0)
  | multiFunc (IntPair (x,y)) = IntNum (x+y)
  | multiFunc (StringSingle s) = Str (implode (rev (explode s)))
通过让函数名以小写字母开头,我可以直观地将它们与RealTriple之类的值构造函数区分开来。我不写:OutputArgs,而是让函数的类型被推断出来。我省略了像StringSingles或explodes这样的冗余括号:在许多编程语言中,函数调用必须有括号。在标准ML中,函数应用程序是通过将左边的函数和右边的参数并置(用空格分隔)来实现的。所以fx是在x上调用的f,fxy是在y上作为函数返回的

出于某种原因,它无法将输入参数识别为RealTriple

这是因为输入不是RealTriple,而是reals real*real*real的3元组

请尝试:

- MultiFunc (RealTriple (1.0, 2.0, 3.0));
> val it = RealNum 2.0 : OutputArgs
下面是我编写函数的方法:

fun multiFunc (RealTriple (x, y, z)) = RealNum ((x+y+z)/3.0)
  | multiFunc (IntPair (x,y)) = IntNum (x+y)
  | multiFunc (StringSingle s) = Str (implode (rev (explode s)))
通过让函数名以小写字母开头,我可以直观地将它们与RealTriple之类的值构造函数区分开来。我不写:OutputArgs,而是让函数的类型被推断出来。我省略了像StringSingles或explodes这样的冗余括号:在许多编程语言中,函数调用必须有括号。在标准ML中,函数应用程序是通过将左边的函数和右边的参数并置(用空格分隔)来实现的。所以fx是在x上调用的f,fxy是在y上作为函数返回的