Haskell 递归地使用foldl之类的函数

Haskell 递归地使用foldl之类的函数,haskell,Haskell,作为练习,我尝试编写一个与foldl函数行为相同的函数,并且尝试使用递归 我的函数将被称为“leftFolder”,签名将看起来像foldl函数的: leftFolder::(a->b->a)->a->[b]->a 我有点纠结于该怎么做,但以下是我尝试过的: leftFolder :: (a -> b -> a) -> a -> [b] -> a leftFolder [] = [] leftFolder (x:xs) = x (++) (leftFolder xs

作为练习,我尝试编写一个与foldl函数行为相同的函数,并且尝试使用递归

我的函数将被称为“leftFolder”,签名将看起来像foldl函数的:
leftFolder::(a->b->a)->a->[b]->a

我有点纠结于该怎么做,但以下是我尝试过的:

leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder [] = []
leftFolder (x:xs) = x (++) (leftFolder xs)

在我看来,这是有道理的。我是说如果列表是空的,返回一个空列表。如果不是,那么就把它放在列表的开头,然后继续把它放在后面。

你的代码有很多问题。例如:

  • 您可以将模式匹配作为第一个参数
    []
    ,而第一个参数应该是函数
  • 您只使用了1个参数,而不是所需的3个参数
  • x(++)…
    毫无意义;您可能打算使用
    x:…
  • 在第一个模式匹配中,您将返回一个列表,而函数的返回类型不一定是列表
我相信你要找的是:

leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder _ c [] = c
leftFolder fn c (x:xs) = leftFolder fn (fn c x) xs


也就是说:如果列表为空,那么我们将在第二个位置返回累积值。否则,我们将计算新的累积值(
fn c x
),然后将其作为第二个参数传递给我们的函数,同时转发
fn
,并传递列表的其余部分。

您的代码有很多问题。例如:

  • 您可以将模式匹配作为第一个参数
    []
    ,而第一个参数应该是函数
  • 您只使用了1个参数,而不是所需的3个参数
  • x(++)…
    毫无意义;您可能打算使用
    x:…
  • 在第一个模式匹配中,您将返回一个列表,而函数的返回类型不一定是列表
我相信你要找的是:

leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder _ c [] = c
leftFolder fn c (x:xs) = leftFolder fn (fn c x) xs


也就是说:如果列表为空,那么我们将在第二个位置返回累积值。否则,我们将计算新的累积值(
fn c x
),然后将其作为第二个参数传递给我们的函数,同时转发
fn
,并传递列表的其余部分。

您的代码有很多问题。例如:

  • 您可以将模式匹配作为第一个参数
    []
    ,而第一个参数应该是函数
  • 您只使用了1个参数,而不是所需的3个参数
  • x(++)…
    毫无意义;您可能打算使用
    x:…
  • 在第一个模式匹配中,您将返回一个列表,而函数的返回类型不一定是列表
我相信你要找的是:

leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder _ c [] = c
leftFolder fn c (x:xs) = leftFolder fn (fn c x) xs


也就是说:如果列表为空,那么我们将在第二个位置返回累积值。否则,我们将计算新的累积值(
fn c x
),然后将其作为第二个参数传递给我们的函数,同时转发
fn
,并传递列表的其余部分。

您的代码有很多问题。例如:

  • 您可以将模式匹配作为第一个参数
    []
    ,而第一个参数应该是函数
  • 您只使用了1个参数,而不是所需的3个参数
  • x(++)…
    毫无意义;您可能打算使用
    x:…
  • 在第一个模式匹配中,您将返回一个列表,而函数的返回类型不一定是列表
我相信你要找的是:

leftFolder :: (a -> b -> a) -> a -> [b] -> a
leftFolder _ c [] = c
leftFolder fn c (x:xs) = leftFolder fn (fn c x) xs


也就是说:如果列表为空,那么我们将在第二个位置返回累积值。否则,我们计算新的累积值(
fn c x
),然后将其作为第二个参数传递给我们的函数,同时转发
fn
,并传递列表的其余部分。

。。。当你尝试这个时会发生什么?(我想我可以猜,但你应该把它添加到你的问题中!)“如果列表为空,请返回一个空列表。”但我不想要列表,我想选择一个
a
!回想一下
foldl(+)2[3,4,5]=((2+3)+4)+5
。您的
leftFolder
应该接受多少个参数?。。。当你尝试这个时会发生什么?(我想我可以猜,但你应该把它添加到你的问题中!)“如果列表为空,请返回一个空列表。”但我不想要列表,我想选择一个
a
!回想一下
foldl(+)2[3,4,5]=((2+3)+4)+5
。您的
leftFolder
应该接受多少个参数?。。。当你尝试这个时会发生什么?(我想我可以猜,但你应该把它添加到你的问题中!)“如果列表为空,请返回一个空列表。”但我不想要列表,我想选择一个
a
!回想一下
foldl(+)2[3,4,5]=((2+3)+4)+5
。您的
leftFolder
应该接受多少个参数?。。。当你尝试这个时会发生什么?(我想我可以猜,但你应该把它添加到你的问题中!)“如果列表为空,请返回一个空列表。”但我不想要列表,我想选择一个
a
!回想一下
foldl(+)2[3,4,5]=((2+3)+4)+5
。你的
leftFolder
应该接受多少个参数?我在这里试图理解你的代码。你是说我们有这个leftFolder函数,我们将通过它传递3个参数。“u”表示我们不关心该参数是什么,然后第二个c参数表示累加器的起点。“[]”表示正在传递的空列表。我需要帮助理解第三行。您的意思是,我们将传递一个函数参数(fn表示(+))和一个累加器变量c,以及一个带有头和尾的列表。我需要帮助了解“leftFolder fn(fn c x)xs”的情况
leftFolder fn(fn c x)xs
意味着对以下参数递归应用
leftFolder
函数