- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在研究一个单独的函数,该函数返回一个列表,该列表在列表 l 的每个 k 元素之后插入元素 x(从
列表的末尾)。例如,单独的 (1, 0, [1,2,3,4]) 应该返回 [1,0,2,0,3,0,4]。我完成了该功能并使其工作如下:
fun separate (k: int, x: 'a, l: 'a list) : 'a list =
let
fun kinsert [] _ = []
| kinsert ls 0 = x::(kinsert ls k)
| kinsert (l::ls) i = l::(kinsert ls (i-1))
in
List.rev (kinsert (List.rev l) k)
end
最佳答案
这些或多或少是我尝试使用 foldl
编写函数时的想法。/foldr
:
foldl
/foldr
从组成最终结果的逻辑中抽象出列表递归。 foldr
使用和 kinsert
给 foldr
的函数不是递归函数:fun separate (k, x, L) =
let fun kinsert (y, ys) = ...
in foldr kinsert [] L
end
kinsert
也可能是匿名的。 kinsert
因为你需要一份 k
( i
) 您逐渐递减并重置为 k
每次达到 0 时。所以同时列表kinsert
吐出相当于折叠的累积变量,i
以大致相同的方式临时累积(偶尔重置)。 kinsert
的累积变量为 i
腾出空间:fun separate (k, x, L) =
let fun kinsert (y, (i, xs)) = ...
in foldr kinsert (?, []) L
end
'a * 'a list
,这会导致两个问题:1)我们只是真的很想积累 i
暂时的,但它是最终结果的一部分。这可以通过使用 #2 (foldr ...)
丢弃它来规避。 . 2) 如果结果现在是一个元组,我不知道该放什么作为第一个 i
代替 ?
. kinsert
是一个单独的函数声明,你可以使用模式匹配和多个函数体:fun separate (k, x, L) =
let fun kinsert (y, (0, ys)) = ...
| kinsert (y, (i, ys)) = ...
in ... foldr kinsert ... L
end
kinsert
偏离折叠以一种方式执行的递归模式:在中间模式中,当 i
匹配 0
,你没有砍掉一个元素 ls
,否则折叠会迫使您这样做。所以你的 0
shell 看起来与原来的略有不同;您可能会遇到逐一错误。 foldr
实际上首先访问列表中的最后一个元素,此时 i
将有其初始值,其中与原始 kinsert
, i
的初始值当你在第一个元素时。 foldl
或 foldr
你会遇到不同的问题:foldl
将反转您的列表,但以正确的顺序处理项目。 foldr
将保持列表顺序正确,但在 k
时会产生不同的结果不分L
的长度... foldl
并反转列表:fun separate (k, x, L) =
let fun kinsert (y, (?, ys)) = ...
| kinsert (y, (i, ys)) = ...
in rev (... foldl kinsert ... L)
end
separate (2, 0, [1,2,3,4,5])
应该给 [1,2,0,3,4,0,5]
而不是 [1,0,2,3,0,5]
. 关于sml - 使用 foldl/foldr 插入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49163757/
Haskell 有两个用于列表的左折叠函数:foldl ,和一个“严格”版本,foldl' .非严格 foldl 的问题是它建立了一个 thunk 塔: foldl (+) 0 [1..5]
我正在学习haskell,并且尝试在不使用递归的情况下编写自己的反向函数。 解决方案是这个函数: myreverse = foldl (flip (:)) [] 我试图了解在评估过程中会发生什么,比如
import Data.List test :: Int -> Int test n = foldl' (+) 0 [1..n] main :: IO () main = do print $ t
首先,我正在阅读的Real World Haskell说永远不要使用foldl,而是使用foldl'。所以我相信它。 但我不清楚何时使用 foldr 和 foldl'。尽管我可以看到它们以不同方式工作
首先,我了解(几乎)折叠函数。鉴于该功能,我可以很容易地计算出会发生什么以及如何使用它。 问题是关于它的实现方式,这导致函数定义略有不同,需要一些时间才能理解。更糟糕的是,大多数折叠示例具有相同类型的
作为我的第一个模块体验,我将 Data.List 导入到我的 GHCi。 (更准确地说,我在 GHCi 上输入了 import Data.List)它似乎工作正常,因为我可以使用一些以前没有的功能,例
我对严格与非严格的定义有疑问。 Haskell wiki-book for Laziness (http://en.wikibooks.org/wiki/Haskell/Laziness) 在“黑盒严
今天,当我在编写一个小脚本时,我使用了 foldl而不是 foldl' .我得到了stack overflow ,所以我导入了Data.List (foldl')并对此感到满意。这是我的默认工作流程
有很多good questions and answers关于 Haskell 中的 foldl、foldr 和 foldl'。 所以现在我知道: 1) foldl 是懒惰的 2) 不要使用 fold
谁能解释一下 foldl 是如何工作的? 我明白,例如,foldr (-) 0 [1,2,3] 产生 (1 - (2 - (3 - 0))),而 foldl (-) 0 [1,2,3] 产生 (((0
我试图让一个使用 foldl 的函数工作 遍历元组列表并从中创建一个字符串。 我正在尝试创建一个已经使用递归工作的类似函数。 这是我试图编译的代码: citeBook :: (String, Stri
foldl :: (a -> b -> a) -> a -> [b] -> a foldl step zero (x:xs) = foldl step (step zero x) xs foldl _
两天前我刚开始使用 Haskell,所以我还不确定如何优化我的代码。 作为练习,我重写了 foldl和 foldr (我将在这里给出 foldl 但 foldr 是相同的,将 last 替换为 hea
我是 Haskell 的初学者,即使在阅读了几个对 foldr/foldl 的解释之后,我也无法理解为什么我会在下面得到不同的结果。解释是什么? Prelude> foldl (\_ -> (+1))
根据任务,我们必须通过 foldr 实现 foldl。通过比较函数签名和 foldl 实现,我得到了以下解决方案: myFoldl :: (a -> b -> a) -> a -> [b] -> a
我有这个代码: import Data.List newList_bad lst = foldl' (\acc x -> acc ++ [x*2]) [] lst newList_good lst
Learn You a Haskell解释foldl1: The foldl1 and foldr1 functions work much like foldl and foldr, only yo
foldl 和 foldr 之间的区别只是循环的方向吗?我认为他们所做的事情有所不同,而不仅仅是方向不同? 最佳答案 如果您的函数不具有关联性(即,用括号括起表达式的方式很重要),则存在差异,例如,
我已经为 foldr 苦苦挣扎了一段时间。我想将一个整数列表转换为一个包含列表总和和整数数量的元组。例如 [1,2,3,4] -> (10,4)我在下面的函数很好地遍历了列表,但只输出最后一个元素作为
我们定义了以下数据类型 Stupid : import qualified Data.Vector as V import Data.List (foldl') data Stupid = Stupi
我是一名优秀的程序员,十分优秀!