相关疑难解决方法(0)

始终保证`seq`的评估顺序(另外还有'pseq`的奇怪行为)

seq功能文档说明如下:

关于评估顺序的注释:表达式seq a b不保证a将在之前进行评估b.给出的唯一保证seq是,既ab会前进行评估seq返回一个值.特别是,这意味着b可以在之前进行评估a.如果需要保证特定的评估顺序,则必须使用pseq"并行"软件包中的功能.

所以我有一个sum带累加器的懒函数:

sum :: Num a => [a] -> a
sum = go 0
  where
    go acc []     = acc
    go acc (x:xs) = go (x + acc) xs
Run Code Online (Sandbox Code Playgroud)

显然,这在大名单上非常缓慢.现在我用seq以下方法重写这个函数:

sum :: Num a => [a] -> a
sum = go 0
  where
    go acc []     = acc
    go acc (x:xs) = …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation operator-precedence ghc

17
推荐指数
2
解决办法
531
查看次数

C++20之前所有程序都是UB?

昨天我在大卫·斯通的演讲中听到了这一点

在 C++20 之前,不可能实现std::vector所有向量实现,如果它们是用 C++ 编写的,则具有未定义的行为。

但并没有真正关注它。

直到今天,当我观看《C++ 对象模型的量子解释》时,他开头说

在 C++20 之前,所有 C++ 程序都是未定义的。从 C++20 开始,它们可能仍然是未定义的,但至少不是出于生命周期的原因。

他在说什么?


我知道有些事情不能仅通过使用该语言中可用的内容来实现(我想std::mutex肯定不能?);我知道这显然是所有(?)编程语言中都存在的问题,例如 Haskellseq需要编译器支持。

但是有人真的告诉我我无法实施吗std::monostate

我的观点是,有些事情可以仅通过语言工具来实现,有些事情不能。什么使得std::vector属于后一类?

c++ undefined-behavior language-lawyer c++20

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

seq代表什么是haskell

我是哈斯凯尔的新手,刚刚来到懒惰的世界.我读到该seq功能非常特殊,因为它强制使用严格的评估,以便在某些情况下更有效.但我根本无法找到什么seq代表字面意思.也许严格评价Q*???

haskell seq

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