SMLNJ错误:类型构造函数列表给出0个参数,想要1

时间:2018-04-09 14:54:38

标签: compiler-errors sml smlnj

我是标准ML的新手,我无法找到解决此错误的方法:

fun without_i (num:int) (lista:list) (result:list) (lcm_wi:real)=
    if (num>=N-1) then result
    else
      let
        val a = (gcd(lista,lcm_wi))
        val b = List.nth(lista,num)
      in
        without_i (num+1) lista ((lcm_wi)::result) ((b/a)*lcm_wi)
      end
;

val before_i_rev = without_i 0 Rate [] 1.0;

错误:输入0参数的构造函数列表,想要1。

如何修复此错误? 还有,有办法将REAL转换为INT ??

1 个答案:

答案 0 :(得分:1)

  

如何解决此错误?

  • 当您通过Moscow ML管道此程序时,它会出现稍微更易读的错误:

    ! Toplevel input:
    ! fun without_i (num:int) (lista:list) (result:list) (lcm_wi:real)=
    !                                ^^^^
    ! Arity mismatch! 
    

    这里,list是类型构造函数,它期望一个类型作为它前面的参数,例如(lista : real list)。在SML中,您不能在没有类型参数的情况下引用类型构造函数。像alist这样的不能单独使用list类型。

    在某些情况下,您可能希望在没有参数的情况下引用类型构造函数,但也不能。例如,如果要定义类型别名type stack = list,则仍需写出类型参数:

    type 'a stack = 'a list
    
  • 您不需要明确的类型注释;你可以使用类型推断:

    fun without_i num lista result lcm_wi =
        if num >= N-1 then result
        else
          let
            val a = gcd(lista, lcm_wi)
            val b = List.nth(lista, num)
          in
            without_i (num+1) lista ((lcm_wi)::result) ((b/a)*lcm_wi)
          end
    

    (在此示例中,括号和空格也已重新格式化。)

  • 当您的输入不是整数时,我真的不确定gcdlcm的含义。似乎gcd (lista, lcm_wi)需要real listreal。这可能不是通常已知类型为gcd的{​​{1}}函数。

  • 如果您对int * int -> intnum的意图是处理N的每个元素,并且您一次只使用lista的一个元素并丢弃它,您可能还要对此参数执行列表递归:

    lista

    通过将fun without_i lista = let fun loop [] result lcm_wi = [] (* or [lcm_wi]? *) | loop (b::bs) result lcm_wi = let val a = gcd (lista, lcm_wi) in loop bs (lcm_wi::result) ((b/a)*lcm_wi) end in loop lista [] 1.0 end 传递给lista一次删除一个loop,您可以递归地引用完整的b和每个lista

  

有没有办法将真实转换为int?

您可以通过多种方式将实数转换为整数:floor, ceil, trunc, round

这完全取决于你打算用小数部分做什么。