List 函数式编程,Haskell将函数应用于变量列表

List 函数式编程,Haskell将函数应用于变量列表,list,haskell,functional-programming,List,Haskell,Functional Programming,我有一个Csp->Var->Int->Csp类型的函数,我想把这个函数应用到[Var]的列表中,只是想知道是否有人能帮我解决这个问题,我完全被迷惑了 这可能就是你要找的,不是吗 这可能就是您要查找的,不是吗?map接受一个函数并将其应用于值列表。 作为一个简单的例子,如果我有一个函数fx=x+5,一个列表l=[1,2,3],那么map fl将返回[6,7,8] 给定f::Csp->Var->Int->Csp和l::[Var],您应该编写 map (\x -> f csp x int) l

我有一个Csp->Var->Int->Csp类型的函数,我想把这个函数应用到[Var]的列表中,只是想知道是否有人能帮我解决这个问题,我完全被迷惑了

这可能就是你要找的,不是吗

这可能就是您要查找的,不是吗?

map接受一个函数并将其应用于值列表。 作为一个简单的例子,如果我有一个函数fx=x+5,一个列表l=[1,2,3],那么map fl将返回[6,7,8]

给定f::Csp->Var->Int->Csp和l::[Var],您应该编写

map (\x -> f csp x int) l -- note that the variable names (like "csp") can be anything
其类型为::Csp->Int->Csp。换句话说,它将返回一个函数列表。

map接受一个函数并将其应用于一个值列表。 作为一个简单的例子,如果我有一个函数fx=x+5,一个列表l=[1,2,3],那么map fl将返回[6,7,8]

给定f::Csp->Var->Int->Csp和l::[Var],您应该编写

map (\x -> f csp x int) l -- note that the variable names (like "csp") can be anything

其类型为::Csp->Int->Csp。换句话说,它将返回一个函数列表。

您需要的是一个折叠。foldl的签名是foldl::a->b->a->a->[b]->a,因此在您的例子中,您希望a是Csp h,b是Var,这给了您foldl::Csp->Var->Csp->Csp->[Var]->Csp类型。对于第一个参数,您只需传递类似于\csp var->f csp var yourfixedt的内容,其中f是您的函数

如果您不熟悉它的用途,那么对于变量列表中的每个变量,您传递给它的函数在本例中只是将Int参数固定到Csp累加器和var的函数


关于折叠有很多更好的解释,但我想我至少应该包括一个简短的评论,你想要的是折叠。foldl的签名是foldl::a->b->a->a->[b]->a,因此在您的例子中,您希望a是Csp h,b是Var,这给了您foldl::Csp->Var->Csp->Csp->[Var]->Csp类型。对于第一个参数,您只需传递类似于\csp var->f csp var yourfixedt的内容,其中f是您的函数

如果您不熟悉它的用途,那么对于变量列表中的每个变量,您传递给它的函数在本例中只是将Int参数固定到Csp累加器和var的函数


有很多关于折叠的更好的解释,但我想我至少应该包括一个简短的评论

你想要折叠,或者我听起来是这样。 假设你的函数是f


你想要折叠,或者我觉得是这样。 假设你的函数是f


从您的评论中,听起来您想要折叠,例如:

foo :: Csp -> Var -> Int -> Csp -- your function

bar :: Csp -> [Var] -> Int -> Csp
bar c0 vs x = foldl (\c v -> foo c v x) c0 vs
尽管可能值得稍微更改参数的顺序,使其更适合部分应用:

foo :: Int -> Csp -> Var -> Csp

bar :: Int -> Csp -> [Var] -> Csp
bar x = foldl (foo x)

从您的评论中,听起来您想要折叠,例如:

foo :: Csp -> Var -> Int -> Csp -- your function

bar :: Csp -> [Var] -> Int -> Csp
bar c0 vs x = foldl (\c v -> foo c v x) c0 vs
尽管可能值得稍微更改参数的顺序,使其更适合部分应用:

foo :: Int -> Csp -> Var -> Csp

bar :: Int -> Csp -> [Var] -> Csp
bar x = foldl (foo x)

我想你需要折叠一下

answer :: (Csp -> Var -> Int -> Csp) -> Csp -> [Var] -> Int -> Csp
answer f csp vs i = foldl (\csp' v -> f csp' v i) csp vs

我想你需要折叠一下

answer :: (Csp -> Var -> Int -> Csp) -> Csp -> [Var] -> Int -> Csp
answer f csp vs i = foldl (\csp' v -> f csp' v i) csp vs

int/csp参数是否应该是固定的,您是想使用csp参数进行迭代,还是希望结果是[csp->int->csp]类型的列表?澄清一下:除了var列表之外,您还有一个csp和一个int,并且您想要一个csp列表,这是正确的吗?这里没有太多内容。你能更具体一点,添加一些代码,显示你尝试过的,你期望的结果,等等吗?我希望结果是csp,我希望使用csp和int将函数应用于[var]列表中的所有项,int应该保持不变,但是每次在[var]中的某个东西上使用该函数时,csp都应该改变举个例子,如果int/csp参数应该是固定的,您是想使用csp参数进行迭代,还是希望结果是[csp->int->csp]类型的列表?澄清一下:除了var列表之外,您还有一个csp和一个int,并且您想要一个csp列表,这是正确的吗?这里没有太多的内容。你能更具体一点,添加一些代码,显示你尝试过的,你期望的结果,等等吗?我希望结果是csp,我希望使用csp和int将函数应用于[var]列表中的所有项,int应该保持不变,但是每次在[var]中的某个东西上使用该函数时,csp都应该改变一个示例不会尝试使用map,但我发现此错误无法将预期类型[CSP]与推断类型匹配CSPOP希望将值映射到三参数函数的第二个参数上。这需要更多的解释。我尝试使用map,但我发现此错误无法将预期类型[CSP]与推断类型匹配。CSPOP希望将值映射到三参数函数的第二个参数上。这需要更多的解释。