Function 标准ML和函数

Function 标准ML和函数,function,types,sml,ml,Function,Types,Sml,Ml,我遇到一个问题,要求我提供一个函数,该函数对给定变量x中的所有元素求和。例如,sum([5,5,5])应该返回15 当我测试这样一个整数的和时,我的麻烦就来了:sum(5) 该函数应该能够返回到单个数字和数字列表之间的第四位。我知道要做到这一点,我需要一个数据类型,它有一些Int of Int | Null |… 我的问题是如何使下面的代码在测试用例中工作sum(5) 我想我需要这样的东西: else if (int? x) then x else hd(x) + sum(tl(x)) 但当我

我遇到一个问题,要求我提供一个函数,该函数对给定变量
x
中的所有元素求和。例如,
sum([5,5,5])
应该返回15

当我测试这样一个整数的和时,我的麻烦就来了:
sum(5)

该函数应该能够返回到单个数字和数字列表之间的第四位。我知道要做到这一点,我需要一个数据类型,它有一些
Int of Int | Null |…

我的问题是如何使下面的代码在测试用例中工作
sum(5)

我想我需要这样的东西:

else if (int? x) then x
else hd(x) + sum(tl(x))

但当我对我的数据类型执行此操作时,我得到了int与int list的冲突

快速回答你的问题:那是不可能的。正如您正确地说的,您需要一个允许您保存单个整数或整数列表的数据类型。您可以介绍这样一种类型,如:

datatype my_int = SingleInt of int | ManyInts of int list

fun sum (SingleInt i) = i
  | sum (ManyInts is) = foldl op+ 0 is
但这真的有点傻,因为如果你仔细想想,类型
int list
已经可以包含一个整数或一组整数(甚至零整数,当涉及求和时,它们有一个定义良好的含义)。因此,将功能扩展到处理列表之外是没有意义的

无论您是否使用自定义类型,您都无法访问重载,因此在标准ML中无法编写
sum 5
sum[5,5,5]
。在其他函数式语言(如Haskell)中,您可以使用类型类实现这种重载

作为补充,尝试使用模式匹配,而不是if-then-else。你的求和函数是:

fun sum [] = 0
  | sum (x::xs) = x + sum xs
或制作尾部递归版本:

fun sum xs =
    let fun helper [] result = result
          | helper (x::xs) result = helper xs (x+result)
    in helper xs 0 end
或者简单地使用折叠:

val sum = foldl op+ 0

对于您建议的数据类型,测试用例应该类似于
sum(int5)
sum Null
,而不是
sum[5,5,5]
。请详细说明函数应该做什么。好吧,这里的目标是将LISP函数转换为ML。LISP函数不仅适用于列表,还适用于单个原子数字值,该值由(is number?)检查。显然,在这里引用另一个响应在标准ML中是不可能的。要同时引用单个int和list。总和([5,5,5])已按原样运行。需要sum(5)来返回5是我的问题。谢谢,你是对的,我试图转换的代码以这种方式为LISP工作似乎是多余的,我被告知应该可以轻松地转换为ML。似乎不是这样。大多数LISP不是强类型的,所以它们允许接受各种输入的函数/宏(甚至是数量可变的参数),其中ML的类型系统更具限制性。
val sum = foldl op+ 0