当我尝试编译
main = putStrLn $ show x where
2 + x = 7
Run Code Online (Sandbox Code Playgroud)
GHC抱怨
error: Variable not in scope: x
|
1 | main = putStrLn $ show x
| ^
Run Code Online (Sandbox Code Playgroud)
所以它似乎2 + x = 7本身在语法上是有效的,虽然它实际上没有定义x.但为什么会这样呢?
编辑:感谢大家的回答和回复。Language Lawyer 的答案在技术上是正确的,因此被接受,但 Human-Compiler 的答案是唯一符合赏金标准(获得 2+ 分)的答案,或者对问题的特定主题进行了充分阐述。
将对象b
置于协程状态是否定义了行为(例如,将其作为参数,或将其保留在暂停点上),在哪里alignof(b) > __STDCPP_DEFAULT_NEW_ALIGNMENT__?
例子:
inline constexpr size_t large_alignment =
__STDCPP_DEFAULT_NEW_ALIGNMENT__ * 2;
struct alignas(large_alignment) behemoth {
void attack();
unsigned char data[large_alignment];
};
task<void> invade(task_queue &q) {
behemoth b{};
co_await submit_to(q);
b.attack();
}
Run Code Online (Sandbox Code Playgroud)
当调用协程时,协程状态的堆内存通过operator new.
此调用operator new
可能采用以下形式之一:
无论调用采用哪种形式,请注意它不使用接受 a 的重载std::align_val_t,这是分配必须对齐多于 的内存所必需的__STDCPP_DEFAULT_NEW_ALIGNMENT__。因此,如果__STDCPP_DEFAULT_NEW_ALIGNMENT__
必须将对齐大于 的对象保存在协程状态中,则应该无法保证该对象最终会在内存中正确对齐。
async f(): Assertion `reinterpret_cast<uintptr_t>(&b) % 32ull == 0' failed.
Run Code Online (Sandbox Code Playgroud)
所以它绝对不能在 GCC …
注意,这个问题不是关于“内函子范畴的幺半群”。也不是直接关于
Functors (aMonad总是 aFunctor,但这个问题主要关注 monad 变压器)
Haskell 的monad 转换器上的文档SelectT指出
SelectT不是 monad 范畴的函子,许多操作不能通过它解除。
MaybeT,RWST等),但有些不是(ContT,SelectT)?我choice在标准库中找不到一个允许我写的对象
let safeDiv (numer : Choice<Exception, int>) (denom : Choice<Exception, int>) =
choice {
let! n = numer
let! d = denom
return! if d = 0
then Choice1Of2 (new DivideByZeroException())
else Choice2Of2 (n / d)
}
Run Code Online (Sandbox Code Playgroud)
就像在Haskell.我是否想念任何东西,或者是否有第三方图书馆来写这类东西,还是我必须重新发明这个轮子?
C# 7.3 添加了对将泛型类型参数约束为委托类型的支持。
Run Code Online (Sandbox Code Playgroud)public class UsingDelegate<T> where T : System.Delegate { } public class Multicaster<T> where T : System.MulticastDelegate { }
where T : System.Delegate这可能是微不足道的,但是和 之间有什么实际区别吗where T : System.MulticastDelegate?Microsoft 文档中未记录此内容。