Haskell 如何从堆栈中弹出两个元素,然后将它们作为值的总和重新堆栈?
使用“pop>>=(\s1->pop>>=(\s2->pushHaskell 如何从堆栈中弹出两个元素,然后将它们作为值的总和重新堆栈?,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 ->
在此处输入代码
)”
我应该在这里写什么
编译器可以。如果我在代码中添加一个洞。
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