我知道问“为什么我的代码不起作用”不是最好的问题。 但是,我想在 Haskell 中了解更多有关在图论问题的算法上下文中使用 monad 的信息,并以以下代码为起点来了解如何在此类算法中使用 ST monad。 我在一些更简单的算法(快速排序)上取得了进展,并进展到 Dijkstra 的算法。 我无 ...
我知道问“为什么我的代码不起作用”不是最好的问题。 但是,我想在 Haskell 中了解更多有关在图论问题的算法上下文中使用 monad 的信息,并以以下代码为起点来了解如何在此类算法中使用 ST monad。 我在一些更简单的算法(快速排序)上取得了进展,并进展到 Dijkstra 的算法。 我无 ...
我有一个计算,我将值插入到Map ,然后再次查找它们。 我知道在插入之前我从未使用过密钥,但无论如何使用(!)会让我感到紧张。 我正在寻找一种方法来获得一个不返回Maybe的总查找功能,以及类型系统阻止我意外滥用的方法。 我的第一个想法是使monad变换器类似于StateT ,其中状态 ...
这个问题是该线程的续集: https : //stackoverflow.com/a/54317095/4400060 我当时在问有关在ReaderT的环境中携带STRef并在其下执行ST动作的问题。 我的设置现在看起来像: 它总体上很酷-我可以自由访问或修改适当的dataspa ...
Data.Vector.unsafeFreeze的文档说: 不安全[ly]将可变向量转换为不可变向量而不进行复制。 在此操作之后可能不使用可变载体。 我想详细描述这里“不安全”的含义。 在实验上,它似乎“仅”意味着对原始可变向量的进一步修改将导致unsafeFreeze返回 ...
但是, STT的文档说: 此monad转换器不应该与包含多个答案的monad一起使用,例如list monad。 原因是状态令牌将在不同的答案之间重复,这会导致发生不良情况(例如,丢失参照透明性)。 安全的monad包括monad State,Reader,Writer,Maybe ...
使用StateT monad 转换器,我可以创建类型StateT s [] a ,它与s -> [(a, s)]同构。 现在我更喜欢使用STT monad 转换器,因为我想要多个不同类型的可变变量,并且希望能够根据早期计算的结果随意实例化它们。 但是, STT的链接文档明确提到: 这个 ...
这是一个场景:给定的是一个C库,其核心是一些结构,其中的操作由丰富的C函数提供。 第1步:使用Haskell的FFI创建一个包装器。 它具有myCLibInit :: IO MyCLibObj , myCLibOp1 :: MyCLibObj -> ... -> IO ()等 ...
我过去一两个月一直在学习Haskell,最近解决了这个编码问题。 另一个挑战是在没有额外空间和线性时间的情况下完成任务,我认为这不可能以纯粹的功能方式完成,所以自然而然地我就了解了ST monad,我认为这将是一个很好的机会了解更多信息。 无论如何,这是我编写的代码: 想法是使用1≤ ...
我已经使用ST monad在Haskell中编写了以下代码,并且可以正常工作。 我唯一的问题是如何避免以下代码中显示的复制粘贴。 当我尝试重构代码时,出现编译器错误,我无法完全理解。 有没有一种方法可以避免以下代码中的复制粘贴。 我想知道,是否可以将处理start_1和start_2(截 ...
最初由Launchbury和Peyton Jones设计的ST monad允许Haskell程序员编写命令式代码(使用可变变量,数组等),同时获得该代码的纯接口。 更具体地说, 入口点函数的多态类型 确保包含ST计算的所有副作用,并且结果值是纯的。 这是否经过严格(甚至正式) ...
我最近开始在Hackage上查看核心库,并且有一个我不理解的反复出现的习惯用法。 以下是ST模块的示例: 特别是,我不明白(# new_s, r #) 。 我假设第二个哈希是指一个未装箱的值,但其余的对我来说是一个谜(大概与“新状态”有关)。 ...
我正在尝试构建一个递归函数,为简单起见,可以说它需要一个列表并构建一个数组和一个列表。 因为在构建数组时需要同时读取和写入数组,所以我使用了可变数组,因此可以进行恒定时间的读写。 因此,签名和功能如下所示: 我想要具有以下签名的函数h : 我希望它具有以下大致实现: ...
如何编写以下函数tt ,该函数当前具有错误类型: 我以为在tt runST内,状态变量s可以线程到函数f ,但是以下编译器错误告诉我我错了: 任何意见将不胜感激。 ...
这个最近的SO问题促使我在Haskell中编写了一个不安全且纯粹的ST monad仿真,这是一个稍微修改过的版本,你可以在下面看到: 如果我们能够在没有unsafeCoerce情况下呈现通常的ST monad API,那将是一件unsafeCoerce 。 具体来说,我想说明为什么通常 ...
我想通过使用STArray实现局部突变效应来实现Fisher-Yates算法(就地数组shuffle)而没有副作用,以及一个函数随机数生成器 产生算法所需的随机整数。 我有一个方法def intInRange(max: Int): RNG[Int]我可以用它来产生[0,max)中的 ...
我在haskell中编写了一个小程序,使用State Monad with Vector计算Tree中所有的Int值的出现次数: 但是,不可变向量的“更新”以O(n)复杂度完成。 我正在寻找O(1)中的更新和O(1)中的访问。 据我所知,Mutable Vectors做我想要的。 ...
我一直在研究如何在ST计算中创建和使用多个STUArray。 具体方案是: 创建多个数组,但仅返回其中一个 创建多个数组,但都不返回 创建多个数组并返回多个数组 我有(1)和(2)的答案,但没有(3)的答案。 首先是一些进口,所以我们知道一切都来自哪里: ...
Haskell中的可变载体有三个元素级变异器: 现在我可以使用这些 - 但是这里发生了什么? 什么是PrimMonad ? PrimState是构造函数吗? 我知道这里有一些绑定在PrimMonad类monad上。 thaw返回m (MVector (PrimSta ...
对于在编程竞赛中在Haskell中实现基于粒子的流体模拟,我遇到了一个小问题。 我目前有一个粒子数组,每个模拟步骤都会对其进行修改。 每个粒子都是2个向量的元组:位置和速度(我自己的Vec3D模块)。 在某些时候,我需要从粒子(类似于解压缩列表)中提取位置,我试图这样做: ps'和 ...
我正在阅读论文Typed Logical Variables in Haskell ,但我无法理解最终实现的细节。 特别是在第 4 节中介绍的回溯状态转换器。出于某种原因,我不知道,GHC 认为我需要一个MonadPlus实例用于函数unify中的(ST a) ,如下所示: 我不确定问题是什么, ...