gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:27:28 25 4
gpt4 key购买 nike

如何计算将一种数据类型传递给函数的次数以及值的总数?我是 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...

最佳答案

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

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

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

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)

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

关于haskell - 如何计算传递给haskell函数的类型出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22001792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com