Haskell 递归地使用foldl之类的函数
作为练习,我尝试编写一个与foldl函数行为相同的函数,并且尝试使用递归 我的函数将被称为“leftFolder”,签名将看起来像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
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
函数