Haskell是一种函数式编程语言,具有强大的静态类型,惰性求值,广泛的并行性和并发支持以及独特的抽象功能。
如何在haskell中使用foldr实现插入。 我试过: 插入'' :: Ord a => a -> [a] -> [a] 插入'' e xs =foldr (\x -> \y -> if x 如何在haskell中使用foldr实现插入。 我试过: insert'' :: Ord a => a -> [a] -> [a] insert'' e xs = foldr (\x -> \y -> if x<y then x:y else y:x) [e] xs 没有骰子。 我必须在列表中插入元素 e,以便它位于大于或等于它的第一个元素之前。 示例: insert'' 2.5 [1,2,3] => [1.0,2.0,2.5,3.0] insert'' 2.5 [3,2,1] => [2.5,3.0,2.0,1.0] insert'' 2 [1,2,1] => [1,2,2,1] 在上一个示例中,第一个 2 被插入一个。 编辑: 谢谢@Lee。 我现在有这个: insert'' :: Ord a => a -> [a] -> [a] insert'' e xs = insert2 e (reverse xs) insert2 e = reverse . snd . foldr (\i (done, l) -> if (done == False) && (vj e i) then (True, e:i:l) else (done, i:l)) (False, []) where vj e i = e<=i 但是这不起作用: insert'' 2 [1,3,2,3,3] => [1,3,2,2,3,3] insert'' 2 [1,3,3,4] => [1,3,2,3,4] insert'' 2 [4,3,2,1] => [4,2,3,2,1] 解决方案: insert'' :: Ord a => a -> [a] -> [a] insert'' x xs = foldr pom poc xs False where pom y f je | je || x > y = y : f je | otherwise = x : y : f True poc True = [] poc _ = [x] 谢谢@Pedro Rodrigues(只需将 x>=y 更改为 x>y。) (如何将此标记为已回答?) 你需要 paramorphism 为此: para :: (a -> [a] -> r -> r) -> r -> [a] -> r foldr :: (a -> r -> r) -> r -> [a] -> r para c n (x : xs) = c x xs (para c n xs) foldr c n (x : xs) = c x (foldr c n xs) para _ n [] = n foldr _ n [] = n 有了它, insert v xs = para (\x xs r -> if v <= x then (v:x:xs) else (x:r)) [v] xs 我们可以用 foldr 来模仿 init . tails 的同态,如下所示:需要根据元素升序的中断将列表划分为列表(Haskell)。 因此解决方案是 import Data.List (tails) insert v xs = foldr g [v] (init $ tails xs) where g xs@(x:_) r | v <= x = v : xs | otherwise = x : r 对同态进行编码的另一种方法是通过一系列函数,如 Pedro Rodrigues 的答案中所示,安排 从左到右信息流,同时传递输入列表本身的第二个副本:一个参数(复制 tails 的效果): insert v xs = foldr g (\ _ -> [v]) xs xs where g x r xs | v > x = x : r (tail xs) -- xs =@= (x:_) | otherwise = v : xs -- visual aid to how this works, for a list [a,b,c,d]: -- g a (g b (g c (g d (\ _ -> [v])))) [a,b,c,d] 与他的答案中的版本不同,这不会复制插入点之后的列表结构的其余部分(这是可能的,因为同态性“鱼与熊掌兼得”)。 这是我的看法: insert :: Ord a => a -> [a] -> [a] insert x xs = foldr aux initial xs False where aux y f done | done || x > y = y : f done | otherwise = x : y : f True initial True = [] initial _ = [x] 但是恕我直言,使用 foldr 并不是解决这个问题的最佳选择,对我来说以下解决方案更容易理解: insert :: Int -> [Int] -> [Int] insert x [] = [x] insert x z@(y : ys) | x <= y = x : z | otherwise = y : insert x ys 我想折叠在这里不太方便。它总是处理列表中的all元素,但是您需要在找到第一个出现的元素后停止。 当然这是可能的,但你可能不想使用这个: insert' l a = snd $ foldl (\(done, l') b -> if done then (True, l'++[b]) else if a<b then (False, l'++[b]) else (True, l'++[a,b])) (False, []) l 这是另一个使用 foldr 的解决方案。与这里的其他人相比,它简单易懂。 insert :: Ord a => a -> [a] -> [a] insert a = foldr swap [a] where swap y x_xs@(x:xs) | y > x = x:y:xs | otherwise = y:x_xs 但是,它有一个严重的限制:与使用正常递归解决方案的标准Data.List.insert不同,并且与 Pedro 和 Will Ness 的答案不同,这个版本在给定无限列表时会崩溃。 ghci> take 10 $ insert 4 [1,3..19] -- This works fine. [1,3,4,5,7,9,11,13,15,17] ghci> take 10 $ insert 4 [1,3..] -- This crashes. *** Exception: stack overflow ghci> import qualified Data.List as L (insert) ghci> take 10 $ L.insert 4 [1,3..] [1,3,4,5,7,9,11,13,15,17]
使用GHCup安装haskell包出现问题“addDLL:mingw32或依赖项未加载。(Win32错误126)”错误消息
安装成功安装Haskell后我打开Windows PowerShell并尝试运行haskell然后我收到此错误消息 PS C:\Users\Mee> ghci GHCi,版本 9.4.8:https://www.haskell.org/g...
我正在研究光泽库,作为任何一个理智的人,我对缺乏抗锯齿功能感到非常恼火。我知道一些 OpenGL 窗口提示有助于启用抗锯齿功能,尤其是 GL。
在aeson.Types.ToJSON中,已经有一个ToJSON(Ratio Integer)的调用实例 但它在 JSON 中显示数字如 ("A" % "B"),我想制作一个自定义版本(排序...
如何在 Haskell 中编写上下文无关语法?另外,我制作这个编译器的方向正确吗?
作为参考,我正在学习《编译器原理:技术与工具》(又名“龙书”)这本书。 我正在创建一种语言,您可以在其中添加两个自然数...
mrcjkb/haskell-tools.nvim 插件安装问题
所以,我试图使用标题中的包,但它没有任何作用。我按照他们在 github 链接中所说的方式做了,但没有成功。我尝试使用一个完全作为朋友的配置,结果...
mrcjkb/haskell-tools.nvim 的安装问题
所以,我试图使用标题中的包,但它没有任何作用。我按照他们在 github 链接中所说的方式做了,但没有成功。我尝试使用一个完全作为朋友的配置,结果......
Pandoc 3:获取并修改 Hakyll 4 中 Markdown 到 HTML 转换的默认上下文?
我目前正在和 Hakyll 和 Pandoc 一起玩。 我想从 Markdown 源创建一个静态 HTML 网站,包括 LaTeX 中的内联数学。使用 pandoc-katex 我能够进行转换...
Nix:您在 nixpkgs 版本中获得了哪些 Haskell 软件包?
我想弄清楚给定的 nixpkgs 版本到底选择了哪些版本的 Haskell 软件包。我很感兴趣,所以我知道要查看哪个文档版本,可以设置版本约束...
尽管构建成功,VS Code 仍显示虚拟错误;重新启动 VS Code 可以暂时解决该问题——有什么建议吗?
我在 VS Code 中编码时在 Haskell 中遇到一些错误,例如“不在范围内”、“未导入导出”或“找不到包”。要解决这个问题,我必须q...
我试图编写将所有数据节点乘以给定数字的 monad。 我不知道如何正确定义 Monad。 模块主要在哪里 数据 LinkedList a = NodeWithoutNext a |节点a(链表...
我要读n遍然后把它全部放在一个列表里。我有以下代码,但它不起作用。任何 Haskell/函数专家可以给我一个启发吗? 复制IO n a = do y <- a ...
我一直在努力更好地理解 Haskell 中的 Monad,所以我开始阅读 Philip Wadler 的论文《Monads for functionprogramming》。为了更好地内化原理......
我想知道 Haskell 状态单子 >> 的定义。 据我猜测,它将一种状态传递到另一种状态: (>>) :: 状态 s a -> 状态 s b -> 状态 s b 注明 >> 斯塔...
是否有 Haskell 模式可以避免编写此自定义函数?这个想法是将 Maybe 中的 Nothing 作为错误处理(作为包装 Either 的一部分): 要么MaybeHandle :: Str...
我试图使用 callCC 在 Haskell 中构建一个非常简单的协程示例。 我对 callCC :: ((a -> m b) -> m a) -> m a 工作方式的理解是通过编写 示例 :: 续我...
atomicModifyIORef 的文档说明如下: 此函数对于在多线程程序中安全地使用 IORef 非常有用。如果你只有一个 IORef,那么使用atomicModifyI...
Stack 尝试查找 libgmp 然后失败,即使根本没有依赖项
我使用 nix-darwin 并在 ~/.stack/config.yaml 中启用了 nix。 今天早些时候我做了一个 sudo nix-collect-garbage -d 然后很多事情开始崩溃。 最小可重现示例: 堆栈新mwe cd mwe ...
我是haskell的新手,有一个大学作业任务,只编译 一行仅由一个分号组成。我很好奇,这是否是有意的行为,如果是,为什么? (我...
我有这个问题,我想为 while 语言的抽象形式构建一个解释器。在 while 的情况下,我有一个 m Bool 需要在每个循环之前进行评估