小编kqr*_*kqr的帖子

有人可以解释关于`镜头`库的图表吗?

如果您浏览hackage上的Lens条目,Lens Github的回购,甚至谷歌关于Lens,您会发现许多部分参考资料,如介绍性教程/视频,示例,概述等.由于我已经了解了大部分基础知识,因此我正在寻找更完整的参考资料,以帮助我更多地了解高级功能.换句话说,我仍然不知道意味着什么,并且找不到足够完整的资源来解释这个图形.想法?

haskell lenses haskell-lens

18
推荐指数
1
解决办法
1238
查看次数

是什么让glibc malloc可以比较来自不同"对象"的指针?

指针与关系运算符相比较(例如<,<=,>=>)仅由C标准定义当相同的聚合对象(结构,阵列或联合)内的指针都指向.这在实践中意味着形状的比较

if (start_object <= my_pointer && my_pointer < end_object+1) {
Run Code Online (Sandbox Code Playgroud)

可以变成

if (1) {
Run Code Online (Sandbox Code Playgroud)

通过优化编译器.尽管如此,在K&R的第8.7节"示例 - 存储分配器"中,作者进行了与上述类似的比较.他们原谅这个说法

然而,仍然有一个假设是,sbrk可以有意义地比较返回的不同块的指针.标准不保证这一点,它只允许在数组中进行指针比较.因此,这个版本malloc只能在一般指针比较有意义的机器之间移植.

此外,它出现的执行malloc用在glibc做同样的事情!

更糟糕的是 - 我偶然发现这一点的原因是 - 对于学校作业我应该实现一个基本的malloc功能,并且作业的指示要求我们使用K&R代码,但我们必须更换sbrk拨打电话mmap!

虽然比较来自不同sbrk调用的指针可能是未定义的,但它也只是略微可疑,因为你有某种心理直觉,返回的指针应该来自同一个内存区域.mmap根据我的理解,不同调用返回的指针甚至不能保证彼此远程相似,并且在mmap调用之间合并/合并内存块应该是非常非法的(并且它似乎glibc避免了这种情况,只需合并返回的内存)通过sbrk或内部内mmap,而不是在它们之间)的页面,但分配需要这个.

问题:有人可以发光

  1. 是否sbrk可以优化比较来自不同呼叫的指针,以及
  2. 如果是这样,glibc那会让他们逃脱它.

c malloc glibc language-lawyer

10
推荐指数
1
解决办法
356
查看次数

涉及函数组合的常见模式(\ ab - > f(ga)(gb))

f和g的组成看起来像

f :. g = \a b -> f (g a) (g b)
Run Code Online (Sandbox Code Playgroud)

是我在代码中经常发现的模式.它类似于一元函数组合,只是f二进制,我希望g在它们传递给它们之前应用于两个参数f.

当我要求lambdabot将其转换为无点形式时,我得到了奇怪的咒语

flip ((.) . f . g) g
Run Code Online (Sandbox Code Playgroud)

在我的代码中我不想拥有它,所以我最终只是明确地写出了模式.

是否有一种普遍接受的方法来为这种情况编写组合子?或者我在这种情况下发现自己很奇怪?

我现在没有一个实际的例子,因为当我需要时,我从未想过要问这里,但可以想象用它非常整齐地写出欧几里德距离公式,就像这样:

distance = sqrt . (+) :. (^2)
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming declarative pointfree

9
推荐指数
1
解决办法
389
查看次数

这个列表如何理解其本身的工作原理?

在#haskell IRC频道,有人问道

是否有一种简洁的方法来定义一个列表,其中第n个条目是之前所有条目的平方和?

我认为这听起来像一个有趣的谜题,递归地定义无限列表是我真正需要练习的事情之一.所以我启动了GHCi并开始使用递归定义.最终,我成功了

?> let xs = 1 : [sum (map (^2) ys) | ys <- inits xs, not (null ys)]
Run Code Online (Sandbox Code Playgroud)

这似乎产生了正确的结果:

?> take 9 xs
[1,1,2,6,42,1806,3263442,10650056950806,113423713055421844361000442]
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不知道我写的代码是如何工作的.是否有可能解释当代码以中间Haskell用户理解的方式执行时会发生什么?

recursion haskell lazy-evaluation

9
推荐指数
1
解决办法
227
查看次数

算子法律是否证明结构的完整保存?

在Data.Functor的文档中,以下两个被称为仿函数法则,所有仿函数都应该遵守.

fmap id  ==  id
fmap (f . g)  ==  fmap f . fmap g
Run Code Online (Sandbox Code Playgroud)

我的直觉告诉我仿函数应该工作的方式是它们应该是"结构保留",或者换句话说,如果你有一个函数f :: a -> b而它是逆的g :: b -> a那么

fmap f . fmap g  ==  id
Run Code Online (Sandbox Code Playgroud)

我没有能够提出一个fmap坚持前两个法律并违反第二个法律的实施,但这几乎不能证明.有人可以开导我吗?

haskell functional-programming category-theory

8
推荐指数
1
解决办法
386
查看次数

寻找`if px然后x else empty`构造的概括

我有几个片段,他们觉得他们正在做同样的事情,但我并不完全相信有一个通用的构造来处理它们.在一个地方,我有

ensure :: (String -> Bool) -> String -> String
ensure p x =
    if p x then
        x
    else
        ""
Run Code Online (Sandbox Code Playgroud)

这可能在使用中看起来像

ensure (/= "kim") "alex"    -- returns "alex"
ensure (/= "kim") "kim"     -- returns ""
Run Code Online (Sandbox Code Playgroud)

在另一个,我有非常相似

ensure :: (a -> Bool) -> Maybe a -> Maybe a
ensure p maybeX = do
    x <- maybeX
    if p x then
        Just x
    else
        Nothing
Run Code Online (Sandbox Code Playgroud)

相反,这看起来像

ensure even 6     -- returns Just 6
ensure even 11    -- returns Nothing
Run Code Online (Sandbox Code Playgroud)

两者都根据某个谓词检查值是否正确,如果不是,则返回默认的"空"值.虽然有一点点差异 - …

haskell functional-programming

8
推荐指数
1
解决办法
195
查看次数

限制GHCi中的默认堆栈大小

最近关于Haskell中的堆栈溢出的问题中, kosmikus表示GHCi的默认堆栈大小为512 MB.我宁愿有一个更小的堆栈大小,比如2 MB或者其他东西,因为如果我超越它,几乎在所有情况下,都是因为我的错误.我的系统没有很多内存,因此当我在代码中出错时,512 MB的堆栈大小有时会导致一些疯狂的交换和缓慢.

有没有办法在.ghci文件或其他地方限制GHCi的默认堆栈大小?

我知道我应该能够创建一个

alias ghci='ghci +RTS -K2M -RTS'
Run Code Online (Sandbox Code Playgroud)

作为最后的手段,但我想尽可能避免这种情况.

haskell ghc ghci

7
推荐指数
0
解决办法
821
查看次数