因此,有一种被称为"折叠的普遍属性"的东西,完全如下:
g [] = i; g (x:xs) = f x (g xs) <=> g = fold f i
但是,正如您现在可能的那样,有一些罕见的情况dropWhile,fold f i 除非您将其概括,否则无法重新定义.
最简单但最明显的推广方法是重新定义通用属性:
g' y [] = j y; g' y (x:xs) = h y x xs (g' y xs) <=> g' y = fold (?) l
在这一点上,我可以做出我的假设:我假设存在某种功能p :: a -> b -> b,这将满足等式g' y = fold p l.让我们尝试用普遍属性帮助解决给定的方程式,一开始就提到:
g' y [] = j y = fold p l [] = l …haskell functional-programming proof generic-programming fold
我不太熟悉Redis。目前我正在设计一些实时服务,我想依赖它。我预计每分钟约 10000-50000 个键可以SET合理使用EX,并且很少使用它们来匹配它们,SCAN而不必担心性能瓶颈。
我怀疑的是“输入/输出率”以及可能与某些SCAN查询匹配的键的溢出,因此它永远不会终止(即总是回复最新的光标位置并强制您继续;如果有人消费x items per second并且有的话,这很容易发生x + y items per second coming in和y > 0)。
显然,我可以将所需的SCAN尺寸设置得足够长;但我想知道是否存在更好的解决方案,或者Redis它本身能保证SCAN在这种情况下自动增大大小吗?
一些Haskell源代码(参见参考资料):
-- | Sequential application.
--
-- A few functors support an implementation of '<*>' that is more
-- efficient than the default one.
(<*>) :: f (a -> b) -> f a -> f b
(<*>) = liftA2 id
-- | Lift a binary function to actions.
--
-- Some functors support an implementation of 'liftA2' that is more
-- efficient than the default one. In particular, if 'fmap' is an
-- expensive operation, it is likely …Run Code Online (Sandbox Code Playgroud) 说,我需要System.Eval.Haskell。或者别的什么。我怎么知道我应该在我的文件中指定哪个包package.yaml?当我转到https://hackage.haskell.org/package/plugins-1.5.7/docs/System-Eval-Haskell.html 时,我看不到包名称。
PS“插件”对我不起作用。因此,我认为这是不同的东西。但愿如此 :)
看起来配置中的额外依赖项和“常规”依赖项之间存在一些不太清楚的区别。提到plugins-1.5.7extra-dep 确实有效。我是否在这里做一些依赖管理不善,或者这是绿色的方式?
每当我进行会话(采样和时间线)时,它都会说整个执行的 70-80% 被本机代码占用。这似乎有点可疑,不太确定我是否遇到了有问题的环境(因为由于客观限制,我正在使用该死的 Windows 7),或者它实际上很好?
这是另一个Haskell-through-category-theory问题.
让我们以简单而着名的方式为例.fmap?所以fmap :: (a -> b) -> f a -> f b,省略实际上f是一个事实Functor.据我了解,(a -> b) -> f a -> f b不过是一个语法糖的(a -> b) -> (f a -> f b); 结论:
(1) fmap是产生功能的功能.
现在,Hask也包含函数,因此(a -> b),特别(f a -> f b)是Hask的一个对象(因为Hask的对象是明确定义的Haskell类型 - a-ka数学集 - 并且确实存在(a -> b)每种可能的类型集a,对?).所以,再一次:
(2) (a -> b)是Hask的一个对象.
现在奇怪的事情发生了:fmap显然,它是Hask 的 …
我知道通过合并对某些内容进行排序的经典递归方法。它产生了O(n * log(n))复杂性,可以通过递归关系或多或少地容易地表示出来。
我尝试以迭代方式重新实现归并排序:
def atomize(l):
return list(
map(
lambda x: [x],
l if l is not None else []
)
)
def merge(l, r):
res = []
while (len(l) + len(r)) > 0:
if len(l) < 1:
res += r
r = []
elif len(r) < 1:
res += l
l = []
else:
if l[0] <= r[0]:
res.append(l.pop(0))
else:
res.append(r.pop(0))
return res
def iter_merge_sort(l):
atoms = atomize(l) # O(n)
while len(atoms) > 1: # O(n - …Run Code Online (Sandbox Code Playgroud) 让我从下面的代码开始:
type XmlNode(tagName, innerValue) =
member this.TagName = tagName
member this.InnerValue = innerValue
member this.Atts = Dictionary<string, obj>()
Run Code Online (Sandbox Code Playgroud)
我不使用F#,dict因为(据我所知),一个是readonly,但我显然需要修改我的属性.所以我真的很难让它成为纯粹的功能方式:
type XmlNode with member this.WriteTo (output:StringBuilder) =
output.Append("<" + this.TagName) |> ignore
//let writeAtts =
// List.map2 (fun key value -> " " + key + "=" + value.ToString())
(List.ofSeq this.Atts.Keys) (List.ofSeq this.Atts.Values)
// |> List.reduce (fun acc str -> acc + " " + str)
//output.Append((writeAtts)) |> ignore
output.Append(">" + this.InnerValue + "</" + this.TagName …Run Code Online (Sandbox Code Playgroud) 所以,我的package.yaml包含- hint包。
然后我尝试stack build我的项目。日志:
Configuring hint-0.7.0...
Preprocessing library for hint-0.7.0..
Building library for hint-0.7.0..
[ 1 of 18] Compiling Control.Monad.Ghc ( src/Control/Monad/Ghc.hs, .stack-wor$
[ 2 of 18] Compiling Hint.CompatPlatform ( src/Hint/CompatPlatform.hs, .stack$
[ 3 of 18] Compiling Hint.GHC ( src/Hint/GHC.hs, .stack-work/dist/x86$
[ 4 of 18] Compiling Hint.Extension ( src/Hint/Extension.hs, .stack-work/di$
[ 5 of 18] Compiling Hint.Base ( src/Hint/Base.hs, .stack-work/dist/x8$
[ 6 of 18] Compiling Hint.Conversions ( src/Hint/Conversions.hs, .stack-work/$
[ 7 of 18] Compiling Hint.Annotations …Run Code Online (Sandbox Code Playgroud) phi n 0 = 1
phi n l = 1 + 1 / phi n (l - 1)
Run Code Online (Sandbox Code Playgroud)
显然,最后一次评估的动作不是递归调用,因此给定的实现确实会抛出足够大的值l.
那么重写递归的方式是什么(如果有的话)1)它仍然是递归的,2)变得尾部优化?我认为phi n l result可以工作,但不能相应地重新定义...是否有可靠的方法/技术如何解决这样的问题?