小编Byt*_*ter的帖子

使用两个没有变压器的单子

为了理解如何使用monad变换器,我编写了以下代码而没有一个.它逐行读取标准输入并显示每条反转线,直到遇到空行.它还使用行计算行数,State最后显示总数.

import Control.Monad.State

main = print =<< fmap (`evalState` 0) go where
    go :: IO (State Int Int)
    go = do
        l <- getLine
        if null l
        then return get
        else do
            putStrLn (reverse l)
            -- another possibility: fmap (modify (+1) >>) go
            rest <- go
            return $ do
                modify (+1)
                rest
Run Code Online (Sandbox Code Playgroud)

我想在每行之前添加当前行号.我能够做到StateT:

import Control.Monad.State

main = print =<< evalStateT go 0 where
    go :: StateT Int IO Int
    go = do
        l <- lift getLine …
Run Code Online (Sandbox Code Playgroud)

haskell state-monad monad-transformers

6
推荐指数
2
解决办法
214
查看次数

为什么嵌套数组对象无法提供存储?

提供存储下的生命周期中,它说:

作为一种特殊情况,可以在 unsigned char 或 std::byte (C++17 起) 数组中创建对象(在这种情况下,据说数组为对象提供存储)如果

  • 数组的生命周期已经开始但尚未结束
  • 新对象的存储完全适合数组
  • 数组中没有满足这些嵌套约束的数组对象。

为什么会有第三个条件呢?

即使有一个嵌套数组(我相信这意味着一个从外部数组的某个索引开始并以不远的索引结束的数组,而不是一个作为外部数组的项目的数组,因为术语“嵌套”可能是大多数语言都可以理解),让与嵌套数组不相交的外部数组的一段来提供存储会给标准作者或实现带来什么困难?

而且,如果嵌套数组中没有嵌套任何数组,我是否正确理解它可以提供存储?如果是这样,为什么外部数组不能在同一位置提供存储,即提供存储的段不跨越任何嵌套(可能间接)数组的开头或结尾?

而且,即使跨接,该标准包含此要求以避免出现哪些问题?

另外,嵌套数组是否可以不满足第二个条件,即部分重叠?这样的数组可能存在吗?那么,在什么意义上、在什么条件下,一个嵌套在另一个中呢?两者可以相互嵌套吗?

c++ arrays lifetime language-lawyer

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

减 1 与递减迭代器

“使用 end()-- 迭代到 std::vector 的最后一个元素”的可接受答案中@barry 指出:

请注意,如果 vector::iterator 只是 T* (这将是有效的),则上面的第一种形式是错误的。无论如何,后两者都有效,因此更可取。

参考他的代码:

std::vector<int>::iterator it = --container.end();
std::vector<int>::iterator it = container.end() - 1;
std::vector<int>::iterator it = std::prev(container.end());
Run Code Online (Sandbox Code Playgroud)

这一观点在评论中存在争议,但没有明确的解决方案。这就是我的问题:第一个和第二个之间的语义差异究竟是什么?对于除 之外的结构上的迭代器,答案会有所不同吗vector

c++ pointers iterator pointer-arithmetic undefined-behavior

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

在PostgreSQL中执行直接SQL后“INSERT 0 1”是什么意思?

当我使用 执行包含 SQL 命令的文件时psql -f,我得到如下输出(已截断):

CREATE DOMAIN
CREATE TABLE
CREATE TABLE
INSERT 0 1
INSERT 0 1
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)

数字0和1是什么意思?(我认为1是修改的行数。但是0?)我在PostgreSQL的官方文档或其他任何地方都找不到它。

postgresql sql-insert

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

C++17 中仍然允许 XOR 链表吗?

考虑到 C++17 中引入的语义变化(例如在具有正确地址和类型的指针自 C++17 以来是否仍然始终是有效指针中进行了讨论) ,XOR 链接列表以一种对我来说看起来很可疑的方式使用指针算术。)。它们现在会导致未定义的行为吗?如果是这样,可以通过洗涤来拯救它们吗?

编辑:

维基百科文章仅包含有关指针和整数之间转换的简短注释。我默认(现在明确声明)指针首先被转换为足够大小的整数类型以适合它们,然后对整数进行异或。因此,操作理论中列出的 XOR 属性保证只有从指针获得一次的整数才会被转换回它们。根据标准,从指针到整数的实际映射可以是任意注入。除此之外我不依赖任何假设。

标准是否允许使用它们并访问仍然存在的对象?C++17 之前?从 C++17 开始?

c++ pointer-arithmetic xor-linkedlist c++17

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

计算指向未初始化内存的指针是 C 中的未定义行为吗?

如果我理解正确的话,这个程序在 C++ 中具有未定义的行为,因为中间值p + 1是指向未初始化内存的指针:

int main () {
    int x = 0;
    int *p = &x;
    p = p + 1 - 1;
    *p = 5;
}
Run Code Online (Sandbox Code Playgroud)

如果void放入 的main参数列表中(按照 C 语法的要求),它在 C 中是否也是未定义的行为?

c pointers pointer-arithmetic undefined-behavior

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

比较是否真的允许返回数字而不是布尔值,为什么?

我在 Python 文档的真值测试下发现了一个令人惊讶的句子:

\n
\n

除非另有说明,具有布尔结果的运算和内置函数始终返回 0 或 False(表示 false)和 1 或 True(表示 true)。

\n
\n

关系运算符似乎没有例外语句,因此 IIUC 它们可以返回0and1而不是某些内置类型(例如 )的值上的Falseand ,甚至是不确定的。True7 < 3

\n

因此,为了满足我的代码生成类型值bool或防御性编程(只要这很重要)的规范要求,我应该将逻辑表达式包装在对 的调用中吗bool

\n

附加问题:为什么会有这个纬度?它是否使 CPython 或其他实现变得更容易?

\n

编辑\n问题已得到解答并且我已接受,但我想在PEP 285 \xe2\x80\x93 添加布尔类型中添加它,我发现了以下语句:

\n
    \n
  1. 所有概念上返回布尔结果的内置操作都将更改为返回 False 或 True,而不是 0 或 1;例如,比较、\xe2\x80\x9cnot\xe2\x80\x9d 运算符以及 isinstance() 等谓词。
  2. \n
  3. 所有定义为返回布尔结果的内置操作都将更改为返回 False 或 True,而不是 0 或 1。特别是,这会影响比较 (<、<=、==、!=、>、>=、 is, is not, in, not in),一元运算符 \xe2\x80\x98not\xe2\x80\x99,内置函数 callable()、hasattr()、isinstance() …

python types boolean type-conversion truthiness

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

通过异构标准进行地图比较

mconcat (map comparing [length, last, id]) "abc" "def"
Run Code Online (Sandbox Code Playgroud)

这当然不是类似的.该列表包含从相同域到不同codomains的功能.但我希望意图很明确.某些类型的注释或其他解决方法(不是在3个地方或类似的地方进行比较)可以使它工作吗?

sorting haskell types

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

Scala 3 中特征可以有辅助构造函数吗?

我从辅助类构造函数文章中复制了以下代码,粘贴到 Scastie 中,更改classtrait并将 Scala 版本设置为 3.1.0:

\n
val DefaultCrustSize = 12\nval DefaultCrustType = "THIN"\n\n// the primary constructor\ntrait Pizza (var crustSize: Int, var crustType: String) {\n\n    // one-arg auxiliary constructor\n    def this(crustSize: Int) = {\n        this(crustSize, DefaultCrustType)\n    }\n\n    // one-arg auxiliary constructor\n    def this(crustType: String) = {\n        this(DefaultCrustSize, crustType)\n    }\n\n    // zero-arg auxiliary constructor\n    def this() = {\n        this(DefaultCrustSize, DefaultCrustType)\n    }\n\n    override def toString = s"A $crustSize inch pizza with a $crustType crust"\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是结果。它给出以下错误: …

scala scala-3

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

使用“ptrdiff_t”和“nullptr”完全模拟“intptr_t”?

鉴于intptr_t是可选的并且ptrdiff_t是强制性的,将p - nullptr是 的一个很好的替代品,从用with而不是?(intptr_t)p表示的结果转换回来。它在定义的实现上在语义上与 IIUC 等效,但也按其他方式工作。nnullptr + n(decltype(p))nintptr_t

如果我的上述说法是正确的,为什么该标准不允许不实施intptr_t?看来由此提供的自由并不是特别有价值,只是需要削减一组两个简单的本地源代码转换(或优化的等效项)。

c++ standards pointers integer type-conversion

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

如何使“enable_if”成为硬性要求

该答案包含以下代码:

#include <type_traits>

template<
    typename T, //real type
    typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type
> struct S{};

int main() {
   S<int> s; //compiles
   S<char*> s; //doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

不过,通过为 template 指定任意第二个类型参数,例如,很容易就无法满足T满足的要求。有没有办法排除这种可能性?is_arithmeticSS<char*, void>

c++ templates type-safety type-level-computation

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