小编Fre*_*ler的帖子

为什么`2 + x = 7`有效Haskell?

当我尝试编译

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.但为什么会这样呢?

haskell

48
推荐指数
2
解决办法
6511
查看次数

将奇异对齐的对象置于协程状态是否是定义的行为?

编辑:感谢大家的回答和回复。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 可能采用以下形式之一:

  1. 按照请求的大小传递传递给协程的所有参数,或者如果找不到这样的重载,
  2. 仅传递请求的大小。

无论调用采用哪种形式,请注意它不使用接受 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 …

c++ memory-alignment language-lawyer c++20 c++-coroutine

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

monad 范畴上的函子是什么?

注意,这个问题不是关于“内函子范畴的幺半群”。也不是直接关于Functors (aMonad总是 a Functor,但这个问题主要关注 monad 变压器)


Haskell 的monad 转换器上的文档SelectT指出

SelectT 不是 monad 范畴的函子,许多操作不能通过它解除。

  1. monad类别是什么?该类别中的箭头是什么?
  2. 为什么有些单子变压器上的单子(类别函子MaybeTRWST等),但有些不是(ContTSelectT)?
  3. 从编程的角度来看,成为 monad 范畴的函子有什么好处?作为图书馆的消费者,我为什么要关心?

monads haskell monad-transformers category-theory

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

选择<'T1,'T2>的Monadic操作

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.我是否想念任何东西,或者是否有第三方图书馆来写这类东西,还是我必须重新发明这个轮子?

f# computation-expression

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

`where T : Delegate` 还是 `where T : MulticastDelegate`?

C# 7.3 添加了对将泛型类型参数约束为委托类型的支持。

public class UsingDelegate<T> where T : System.Delegate { }
public class Multicaster<T> where T : System.MulticastDelegate { }
Run Code Online (Sandbox Code Playgroud)

where T : System.Delegate这可能是微不足道的,但是和 之间有什么实际区别吗where T : System.MulticastDelegate?Microsoft 文档中未记录此内容。

.net c# generics delegates

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