如果您浏览hackage上的Lens条目,Lens Github的回购,甚至谷歌关于Lens,您会发现许多部分参考资料,如介绍性教程/视频,示例,概述等.由于我已经了解了大部分基础知识,因此我正在寻找更完整的参考资料,以帮助我更多地了解高级功能.换句话说,我仍然不知道这意味着什么,并且找不到足够完整的资源来解释这个图形.想法?
指针与关系运算符相比较(例如<,<=,>=或>)仅由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,而不是在它们之间)的页面,但分配需要这个.
问题:有人可以发光
sbrk可以优化比较来自不同呼叫的指针,以及glibc那会让他们逃脱它.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 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用户理解的方式执行时会发生什么?
在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坚持前两个法律并违反第二个法律的实施,但这几乎不能证明.有人可以开导我吗?
我有几个片段,他们觉得他们正在做同样的事情,但我并不完全相信有一个通用的构造来处理它们.在一个地方,我有
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中的堆栈溢出的问题中, kosmikus表示GHCi的默认堆栈大小为512 MB.我宁愿有一个更小的堆栈大小,比如2 MB或者其他东西,因为如果我超越它,几乎在所有情况下,都是因为我的错误.我的系统没有很多内存,因此当我在代码中出错时,512 MB的堆栈大小有时会导致一些疯狂的交换和缓慢.
有没有办法在.ghci文件或其他地方限制GHCi的默认堆栈大小?
我知道我应该能够创建一个
alias ghci='ghci +RTS -K2M -RTS'
Run Code Online (Sandbox Code Playgroud)
作为最后的手段,但我想尽可能避免这种情况.