为了理解如何使用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) 在提供存储下的生命周期中,它说:
作为一种特殊情况,可以在 unsigned char 或 std::byte (C++17 起) 数组中创建对象(在这种情况下,据说数组为对象提供存储)如果
- 数组的生命周期已经开始但尚未结束
- 新对象的存储完全适合数组
- 数组中没有满足这些嵌套约束的数组对象。
为什么会有第三个条件呢?
即使有一个嵌套数组(我相信这意味着一个从外部数组的某个索引开始并以不远的索引结束的数组,而不是一个作为外部数组的项目的数组,因为术语“嵌套”可能是大多数语言都可以理解),让与嵌套数组不相交的外部数组的一段来提供存储会给标准作者或实现带来什么困难?
而且,如果嵌套数组中没有嵌套任何数组,我是否正确理解它可以提供存储?如果是这样,为什么外部数组不能在同一位置提供存储,即提供存储的段不跨越任何嵌套(可能间接)数组的开头或结尾?
而且,即使跨接,该标准包含此要求以避免出现哪些问题?
另外,嵌套数组是否可以不满足第二个条件,即部分重叠?这样的数组可能存在吗?那么,在什么意义上、在什么条件下,一个嵌套在另一个中呢?两者可以相互嵌套吗?
在“使用 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
?
当我使用 执行包含 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的官方文档或其他任何地方都找不到它。
考虑到 C++17 中引入的语义变化(例如在具有正确地址和类型的指针自 C++17 以来是否仍然始终是有效指针中进行了讨论) ,XOR 链接列表以一种对我来说看起来很可疑的方式使用指针算术。)。它们现在会导致未定义的行为吗?如果是这样,可以通过洗涤来拯救它们吗?
编辑:
维基百科文章仅包含有关指针和整数之间转换的简短注释。我默认(现在明确声明)指针首先被转换为足够大小的整数类型以适合它们,然后对整数进行异或。因此,操作理论中列出的 XOR 属性保证只有从指针获得一次的整数才会被转换回它们。根据标准,从指针到整数的实际映射可以是任意注入。除此之外我不依赖任何假设。
标准是否允许使用它们并访问仍然存在的对象?C++17 之前?从 C++17 开始?
如果我理解正确的话,这个程序在 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 中是否也是未定义的行为?
我在 Python 文档的真值测试下发现了一个令人惊讶的句子:
\n\n\n除非另有说明,具有布尔结果的运算和内置函数始终返回 0 或 False(表示 false)和 1 或 True(表示 true)。
\n
关系运算符似乎没有例外语句,因此 IIUC 它们可以返回0
and1
而不是某些内置类型(例如 )的值上的False
and ,甚至是不确定的。True
7 < 3
因此,为了满足我的代码生成类型值bool
或防御性编程(只要这很重要)的规范要求,我应该将逻辑表达式包装在对 的调用中吗bool
?
附加问题:为什么会有这个纬度?它是否使 CPython 或其他实现变得更容易?
\n编辑\n问题已得到解答并且我已接受,但我想在PEP 285 \xe2\x80\x93 添加布尔类型中添加它,我发现了以下语句:
\nmconcat (map comparing [length, last, id]) "abc" "def"
Run Code Online (Sandbox Code Playgroud)
这当然不是类似的.该列表包含从相同域到不同codomains的功能.但我希望意图很明确.某些类型的注释或其他解决方法(不是在3个地方或类似的地方进行比较)可以使它工作吗?
我从辅助类构造函数文章中复制了以下代码,粘贴到 Scastie 中,更改class
为trait
并将 Scala 版本设置为 3.1.0:
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这是结果。它给出以下错误: …
该答案包含以下代码:
#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_arithmetic
S
S<char*, void>
c++ ×5
pointers ×3
haskell ×2
types ×2
arrays ×1
boolean ×1
c ×1
c++17 ×1
integer ×1
iterator ×1
lifetime ×1
postgresql ×1
python ×1
scala ×1
scala-3 ×1
sorting ×1
sql-insert ×1
standards ×1
state-monad ×1
templates ×1
truthiness ×1
type-safety ×1