小编til*_*boy的帖子

Haskell groupBy函数:它究竟是如何工作的?

我遇到了以下行为:

ghci :m +Data.List

ghci> groupBy (\x y -> succ x == y) [1..6]
[[1,2], [3,4], [5,6]]
ghci> groupBy (\x y -> succ x /= y) [1..6]
[[1], [2], [3], [4], [5], [6]]

ghci :m +Data.Char   -- just a test to verify that nothing is broken with my ghc

ghci> groupBy (const isAlphaNum) "split this"
["split"," this"]
Run Code Online (Sandbox Code Playgroud)

令我感到惊讶的是,我认为,基于下面的示例,groupBy每当谓词评估True为提供给谓词的两个连续元素时,就会拆分列表.但是在上面的第二个例子中,它会在每个元素上拆分列表,但谓词应该评估为False.我想到了它在Haskell中是如何工作的假设,所以每个人都理解我认为它是如何工作的:

groupBy :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy p l@(x:y:ys)
  | p …
Run Code Online (Sandbox Code Playgroud)

haskell

3
推荐指数
1
解决办法
1198
查看次数

如何检查编译类型的表示?

注释提供了一种有趣的方式来显示结构最终如何在内存中布局。它还表示,对于默认表示,不提供任何保证。虽然我可以使用std::mem::align_ofand检查对齐和大小std::mem::size_of,但有没有办法获得 Rust 布局我的结构/枚举的确切方式,例如带有字段名称和偏移量的表?

memory rust

3
推荐指数
1
解决办法
549
查看次数

Javascript:在getter中混合(对象传播)

我尝试通过扩展运算符语法在getter中创建混合到JS对象中,但它似乎总是返回null.

HTML:

<body>
  <div id="wrapperA"></div>
  <div id="wrapperB"></div>
</body>
<script src='./test.js'></script>
Run Code Online (Sandbox Code Playgroud)

JS:

"use strict";

const mixin = {
    get wrapper() { return document.getElementById(this.wrappername); }
}

const wrapperA = {
  wrappername: 'wrapperA',
  ...mixin
}

const wrapperB = {
  wrappername: 'wrapperB',
  ...mixin
}

console.log(wrapperA);
console.log(wrapperB);
Run Code Online (Sandbox Code Playgroud)

控制台输出:

{wrappername: "wrapperA", wrapper: null}
{wrappername: "wrapperB", wrapper: null}
Run Code Online (Sandbox Code Playgroud)

链接到一个应该工作的扩展函数,从我可以告诉上面的代码创建一个无意的闭包.但是,与...语法相比,它的读取效果非常差.有人知道如何让代码与后一种解决方案一起使用吗?ES开发者是否知道这个问题并将在ES7中修复?

javascript mixins getter-setter ecmascript-next

2
推荐指数
1
解决办法
1017
查看次数

Haskell:模式x ++ xs中的解析错误

执行99-Haskell问题第三个(我目前正在尝试学习该语言)我尝试将模式匹配以及递归合并到我的函数中,现在看起来像这样:

myElementAt :: [a] -> Int -> a
myElementAt (x ++ xs) i =
  if length (x ++ xs) == i && length xs == 1 then xs!!0
  else myElementAt x i
Run Code Online (Sandbox Code Playgroud)

哪能给我Parse error in pattern: x ++ xs.问题:

  1. 为什么这会给我一个解析错误?是因为Haskell不知道在哪里削减我的列表(这是我最好的猜测)?
  2. 我怎样才能重构我的功能以使其有效?算法的想法是检查列表的长度是否为指定的inde; 如果是,则返回最后一个元素; 如果没有删除列表末尾的一个元素,然后进行递归.

注意:我知道这是一个非常糟糕的算法,但我自己设定了编写该函数的挑战,包括递归和模式匹配.我也试过不使用!!运算符,但这对我来说很好,因为它真正做的唯一事情(或者如果编译它应该做)是将单元素列表转换为该元素.

haskell pattern-matching parse-error

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

golangs os.Stat 打开文件吗?

os.Stat(path string) (os.FileInfo, error)函数是否(尝试)打开位于 的文件path,或者是否涉及任何技巧以使其不需要?

另外,多次打开/关闭文件的性能损失是什么(没有读/写,我知道这些很慢),而不是只执行一次?是硬盘绑定的吗?操作系统之间有区别吗?

file-io go

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

人们通常如何在Rust中复制值?

基元应照常按值传递,并且应复制通过引用传递的任何内容(“借用”)。就像是:

let a = 7;
let b = duplicate(a);  // let b = a;

let a = struct{}{};
let b = duplicate(a);  // let b = a.clone();
Run Code Online (Sandbox Code Playgroud)

假设Rust中的每个值都实现CloneCopy特质。这个假设是真的吗?如果没有,是不是可以定义一个特点Duplicate是类型的enum { Clone, Copy }

rust

-2
推荐指数
1
解决办法
764
查看次数