我是标准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 ??
答案 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
(在此示例中,括号和空格也已重新格式化。)
当您的输入不是整数时,我真的不确定gcd
和lcm
的含义。似乎gcd (lista, lcm_wi)
需要real list
和real
。这可能不是通常已知类型为gcd
的{{1}}函数。
如果您对int * int -> int
和num
的意图是处理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
。
这完全取决于你打算用小数部分做什么。