seq功能文档说明如下:
关于评估顺序的注释:表达式
seq a b不保证a将在之前进行评估b.给出的唯一保证seq是,既a和b会前进行评估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) 昨天我在大卫·斯通的演讲中听到了这一点
但并没有真正关注它。
直到今天,当我观看《C++ 对象模型的量子解释》时,他开头说
在 C++20 之前,所有 C++ 程序都是未定义的。从 C++20 开始,它们可能仍然是未定义的,但至少不是出于生命周期的原因。
他在说什么?
我知道有些事情不能仅通过使用该语言中可用的内容来实现(我想std::mutex肯定不能?);我知道这显然是所有(?)编程语言中都存在的问题,例如 Haskellseq需要编译器支持。
但是有人真的告诉我我无法实施吗std::monostate?
我的观点是,有些事情可以仅通过语言工具来实现,有些事情不能。什么使得std::vector属于后一类?
我是哈斯凯尔的新手,刚刚来到懒惰的世界.我读到该seq功能非常特殊,因为它强制使用严格的评估,以便在某些情况下更有效.但我根本无法找到什么seq代表字面意思.也许严格评价Q*???