Functional programming 如何正确实现F中的reduce函数#

Functional programming 如何正确实现F中的reduce函数#,functional-programming,f#,Functional Programming,F#,我对F#和学习列表非常陌生。我很难实现自己的reduce函数。我一直在努力实现这一点。这就是我到目前为止得到的,但我得到一个错误,当调用reduce时,我说我传入的列表类型是int类型,但应该是'a list'类型。我对这件事非常失望,所以欢迎任何帮助 下面是我的代码的样子: let reduce Fn (list: 'a list) = let rec innerFun list acc = match list with | (x::xs

我对F#和学习列表非常陌生。我很难实现自己的reduce函数。我一直在努力实现这一点。这就是我到目前为止得到的,但我得到一个错误,当调用reduce时,我说我传入的列表类型是int类型,但应该是'a list'类型。我对这件事非常失望,所以欢迎任何帮助

下面是我的代码的样子:

let reduce Fn (list: 'a list) = 
      let rec innerFun list acc =
          match list with
          | (x::xs) :: xss ->
              let newAcc = Fn x xs // the fn applied to the head and the next element
              innerFun xss newAcc // recurse through the list with new accumulator
          | [] -> acc // if the list is empty return the accumulator
      innerFun list 0 
               
   //Calling reduce            
   let red2 = reduce (fun x y -> x*y) [23; 4]


你眼前的问题其实很简单,而且纯粹是句法上的:

match list with
| (x::xs) :: xss ->
括号使模式与列表列表匹配,即
x::xs
是列表的头元素,
x
xs
分别是列表的头和尾元素

您需要匹配列表前面的两个元素-您需要删除选项:

match list with
| a::b::tail ->

请注意,您正在使用的命名约定中已经有一个提示,
xs
中的
s
表示复数形式,因此在该模式中,您将列表分为“ex”开头和“ex”结尾。

示例中缺少函数定义的一部分?给出了您看到的问题的答案,但是,在您的实现中,有一些事情是错误的。将其行为与内置的
列表进行比较。减少
,尤其是对于空列表和单元素列表。非常感谢!这很有帮助!我还有一个问题,那就是如何让我的reduce函数接受任何类型?因为我要传递一个int 0作为初始累加器,所以结果总是一些int,但假设我想对其他类型(如字符串或字符)执行reduce函数?有没有办法制作一个通用的累加器?再次感谢这就是我的另一条评论的内容——通常reduce不需要这个显式的初始值,并且对于空输入,它会失败。您可以将此初始值显式化,并将其转换为函数的参数,但此时您实际上正在实现
fold