Functional programming SML/NJ的新成员。从列表中添加数字

Functional programming SML/NJ的新成员。从列表中添加数字,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,定义一个函数,该函数计算 给定的整数列表列表。没有“if-then-else”或任何辅助词 功能 我是函数式编程新手,在SML的正确语法方面遇到了问题。为了解决这个问题,我尝试使用模式匹配创建一个函数,只添加列表的前两个元素。在我完成这项工作之后,我打算使用递归来添加其余的元素。尽管如此,我甚至无法编译这个简单的函数 fun listAdd [_,[]] = 0 | listAnd [[],_] = 0 | listAnd [[x::xs],[y::ys]] = x + y; 您可能不

定义一个函数,该函数计算 给定的整数列表列表。没有“if-then-else”或任何辅助词 功能

我是函数式编程新手,在SML的正确语法方面遇到了问题。为了解决这个问题,我尝试使用模式匹配创建一个函数,只添加列表的前两个元素。在我完成这项工作之后,我打算使用递归来添加其余的元素。尽管如此,我甚至无法编译这个简单的函数

fun listAdd [_,[]] = 0
|   listAnd [[],_] = 0
|   listAnd [[x::xs],[y::ys]] = x + y;

您可能不希望使用
int list
作为输入,而只希望使用
int list*int list
(一对int list)。除此之外,您的函数似乎返回数字,而不是数字列表。为此,您将使用递归

fun listAdd (x::xs, y::ys) = (x + y) :: listAdd (xs, ys)
  | listAdd ([], _) = []
  | listAdd (_, []) = [] (* The last two cases can be merged *)
你可能想从第一页开始读一本关于函数式编程的书。选择Riccardo Pucella的例子,如果你想要一个免费的

fun listAdd [] = 0
  | listAdd ([]::L) = listAdd L
  | listAdd ((x::xs)::L) = x + listAdd (xs::L)
你应该做你想做的事


此外,函数的一部分问题似乎是在不同的子句中为函数指定了不同的名称(listAdd和listAnd)。

为了简单起见,我想说您可能需要:

fun listAdd : (int * int) list -> int list
现在,我将简单地将其定义为解压函数的抽象:

fun listAdd ls :
    case ls of 
        [] => 0
      | (x,y) :: ls' => (x + y) + (listAdd ls')
fun zip xs ys :
    case xs, ys of
        [], [] => []
      | xs, _ => []
      | _, ys => []
      | x::xs', y::ys' => (x,y) :: (zip xs' ys')
我认为没有必要单独列出两份清单。只需获取一个包含整数乘积的列表。如果必须构建此函数,可以调用zip函数:

fun listAdd ls :
    case ls of 
        [] => 0
      | (x,y) :: ls' => (x + y) + (listAdd ls')
fun zip xs ys :
    case xs, ys of
        [], [] => []
      | xs, _ => []
      | _, ys => []
      | x::xs', y::ys' => (x,y) :: (zip xs' ys')
通常,如果您确实需要,可以编写一个更抽象的通用类型函数:

此功能仅为:

fun absProdList f ls =
    case l of 
        [] => []
      | (x,y) :: ls' => (f (x,y)) :: (absProdList f ls')
此函数是您提到的
addList
函数的超类型。只需定义一个匿名函数,将您的
addList
重新创建为:

fun addList' ls =
    absProdList (fn (x,y) => x + y) ls

正如您所看到的,定义泛型类型函数可以通过适当的组合(Currying、高阶函数和匿名函数)更容易、更优雅地对作为泛型类型替换的函数进行特定调用。

如何调用此函数?我尝试了listAdd([4,5],[3,5]);得到了类型错误,这是因为([4,5],[3,5])是一对列表,而不是像你说的列表。试着在[4,5],[3,5]上调用它。如果您想要一对列表的总和,而不是列表的总和,那么您需要一个不同的函数。如果是这样,我可以更新答案以反映这一点。