如何计算传递给haskell中函数的类型的出现次数

Ope*_*ned 3 haskell functional-programming

如何计算数据类型传递给函数的次数和总值?我是FP的新手,不确定这是否是可变性法律或参考透明度允许的.上下文正在使用堆栈并尝试解决,如果您将一系列指令传递给堆栈,您可以计算出传入特定指令的频率以及所有这些类型的总值,作为一种计数器......我已经四处寻找无济于事并开始认为我的方法可能存在根本性的缺陷,所以任何建议都会受到赞赏,但我想我会把它放在那里,因为我有兴趣知道,我正在努力;

> data Value
>   = Numeric Int
>   | Logical Bool
>   deriving (Eq, Show, Read)
...

> data Instruction
>   = Push Value
>   | Pop
>   | Fetch Int
>   | Store Int
...

> step inst c=
>   case (inst) of
>     (Push, stack)    -> (c', x : stack)
>     (Pop, _ : stack) -> (c', stack)
>     where
>         c = c' + 1
...

use*_*038 6

您可以使用Statemonad ,而不是显式管理堆栈Control.Monad.State.有关内部工作的详细信息,请阅读文档.

step :: Instruction -> State [Value] ()
step (Push v) = do 
  stack <- get
  put (v:stack)
step Pop = do 
  (_:stack) <- get
  put stack
Run Code Online (Sandbox Code Playgroud)

您还可以存储状态中每条指令的编号:

step :: Instruction -> State (Int, Int, Int, Int, [Value]) ()
step (Push v) = do 
  (a, b, c, d, stack) <- get
  put (a+1, b, c, d, v:stack)
step Pop = do
  (a, b, c, d, (_:stack)) <- get
  put (a, b+1, c, d, stack)
Run Code Online (Sandbox Code Playgroud)

使用5元组有点麻烦,因此您可能需要为此定义自己的数据类型.在这个模型中,第一个Int是Pushes 的数量,第二个是Pops 的数量等.