gpt4 book ai didi

haskell - 测试 Monadic 代码

转载 作者:行者123 更新时间:2023-12-03 01:22:26 24 4
gpt4 key购买 nike

我正在通过 Haskell course by Brent Yorgey 学习 Haskell 。我刚刚到达 monad 部分,虽然我认为我(终于)对如何使用 monad 有了很好的掌握,但我不明白如何测试使用它们的代码。

本节的练习是编写(简化的)风险模拟,它需要大量使用 Rand StdGen monad。特别是,我们必须编写以下函数:

type Army = Int

data Battlefield = Battlefield { attackers :: Army, defenders :: Army }

battle :: Battlefield -> Rand StdGen Battlefield

它需要一个初始战场,并模拟这场战斗将如何进行。

我有一个实现,但我不明白如何测试它。我无法“获取”由 battle 返回的 Rand StdGen Battlefield 内的值,因此我无法在 GHCI 解释器中打印它们,这就是我的方式到目前为止一直在测试我的代码。我也不知道如何在 Haskell 主函数或其他函数中打印战斗结果。人们如何测试这些类型的功能?

最佳答案

您可以使用 evalRand 等函数“获取”随机计算的结果和 friend 。 evalRand 采用“起始”RandomGen 并确定性地运行单子(monad)计算。

<小时/>

这是我对 evalRand 用途的挥手、不严格的解释:

单子(monad)和命令式编程之间的区别之一是,单子(monad)是计算的表示,而不是计算本身。换句话说,当 Haskell 计算像 a >>= b >>= c (或等效的 do 表示法)这样的表达式时,它只是将乐高积木放在一起,所以可以说 - 直到您使用 evalRand 等函数执行 monad 后,计算才会发生。

举一个更简单的例子,考虑将函数组合在一起。 . 为您提供一个函数,该函数表示由它组成的两个函数执行的计算。当您实际使用参数调用该函数时,您只能从该计算中获得返回值。

这就是为什么标准库中的许多 monad(IO 除外,它由运行时系统执行)提供了一个“陷阱门”函数,例如 evalRand。这就是您实际使用刚刚在单子(monad)代码中定义的计算的方式。

关于haskell - 测试 Monadic 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25960522/

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