Haskell 如何从堆栈中弹出两个元素,然后将它们作为值的总和重新堆栈?

Haskell 如何从堆栈中弹出两个元素,然后将它们作为值的总和重新堆栈?,haskell,state-monad,Haskell,State Monad,使用“pop>>=(\s1->pop>>=(\s2->push在此处输入代码)” 我应该在这里写什么 编译器可以。如果我在代码中添加一个洞。 import Control.Monad.State type Stack = [Integer] pop :: State Stack Integer pop = state $ \(x:xs) -> (x, xs) push :: Integer -> State Stack () push x = state $ \xs ->

使用“pop>>=(\s1->pop>>=(\s2->push
在此处输入代码
)” 我应该在这里写什么

编译器可以。如果我在代码中添加一个洞

import Control.Monad.State

type Stack = [Integer]

pop :: State Stack Integer
pop = state $ \(x:xs) -> (x, xs)

push :: Integer -> State Stack ()
push x = state $ \xs -> ((), (x:xs))

main :: IO()
main = print $ runState `enter code here` [1,2,3,4]
编译器告诉我它应该具有类型
Integer

add = pop >>= \s1 -> pop >>= \s2 -> push _
你能把从堆栈中弹出的值的总和放在那里吗?

你的意思是

   Found hole `_' with type: Integer
popAndSum 2[1,2,3,4,5]
=
[1,2,3,9]


popAndSum 3[1,2,3,4,5]
=
[1,2,12]

你尝试过什么吗?
pop
的定义让我害怕;它是一个隐藏得很深的部分函数。我知道对于堆栈下溢来说,在
标识中失败不会更好,但它不会那么可怕。你为什么认为
s1
s2
不是
Integer
s?我怎么能呢从该位置的类型状态获取整数值?
pop
是一个
状态堆栈整数
。当您
>=
时(发音为bind)它是一个函数
\x->.
x
是一个
整数
.
需要是一个
状态堆栈a
,对于某些类型的
a
。谢谢!!是的,当然s1和s2是整数。我只是很愚蠢:\
popAndSum :: Int -> [Int] -> [Int]
popAndSum elem list = fst xs ++ [sum']
        where
            xs = splitAt ((length list) - elem) list
            sum' = foldl (+) 0 $ snd xs