map的有状态版本(Haskell)

map的有状态版本(Haskell),haskell,higher-order-functions,Haskell,Higher Order Functions,我刚刚学习了如何创建高阶函数,我想创建一个映射函数,它能够将应用于元组的函数更改为将该函数应用于该类型的列表。(就像map函数一样。) 我试图以这样一种方式创建它,即它具有以下签名: statefulMap :: ((a,state) -> (b,state)) -> (([a],state) -> ([b],state)) 我希望能够使用此函数创建一系列全加器,但首先如何创建此函数?这实际上已经存在:我们可以使用a并使用一元版本的map:mapM 例如,我们可以为全加器编写

我刚刚学习了如何创建高阶函数,我想创建一个映射函数,它能够将应用于元组的函数更改为将该函数应用于该类型的列表。(就像map函数一样。) 我试图以这样一种方式创建它,即它具有以下签名:

statefulMap :: ((a,state) -> (b,state)) -> (([a],state) -> ([b],state))

我希望能够使用此函数创建一系列全加器,但首先如何创建此函数?

这实际上已经存在:我们可以使用a并使用一元版本的
map
mapM

例如,我们可以为全加器编写一个函数。这里我认为state是指前一个全加器产生的进位

因此,我们可以制作一个全加器,如下所示:

因此,这将获取一个2元组列表(每个全加器的输入),并生成一个
状态Bool[Bool]
,因此状态仍然是
Bool
,但现在的结果是一个布尔值列表
[Bool]
:一个包含每个全加器输出的列表

我们现在可以用
全加器[(真,真),(真,假),(假,假),(真,真)]
来调用它,但这不会给我们一个布尔值列表,而是一个
状态布尔值[Bool]
。我们可以通过指定初始状态来“运行”状态monad。我们可以通过使用
runState::stateab->a->(a,b)
来实现这一点,因此我们可以使用以下方法调用它:

runState (fullAdders [(True, True), (True, False), (False, False), (True, True)]) False
这将产生:

Prelude Control.Monad.State.Lazy> runState (fullAdders [(True, True), (True, False), (False, False), (True, True)]) False
([False,False,True,False],True)

因此,一个2元组,第一项为结果,第二项为新状态(此处为
True
,因为最后一个全加器的进位输出将为
True
)。

此函数应该做什么?从我所看到的,它接受一个函数作为参数,并返回另一个函数。我很难理解这是怎样的
map
,它的类型是
(a->b)->[a]->[b]
。请注意,
map
有两个参数。例如,您可以将
mapM
与状态monad一起使用。也许您应该查看
mapacuml
和变体。@code学徒:不,这里的括号是多余的,两者相等,因为
->
操作符从右到左工作。@WillemVanOnsem哦…对了…/facepalmWow,谢谢,这正是我要找的!我自己的答案(刚刚回答了我问题的第一部分是:
maprf(x,state)=(mapfst(mapf(zip x(replicate(length x)state))),state)
看起来比你的要混乱得多。
runState (fullAdders [(True, True), (True, False), (False, False), (True, True)]) False
Prelude Control.Monad.State.Lazy> runState (fullAdders [(True, True), (True, False), (False, False), (True, True)]) False
([False,False,True,False],True)