【发布时间】:2016-04-12 18:07:22
【问题描述】:
抱歉,如果问题不太清楚。我不确定表达它的最佳方式(随意编辑!)。我认为一个例子是最清楚的:
我试图根据Haskell definition 定义一个 Monad 概念。绑定运算符 (>>=) 要求 Monad 类型为 A 的函数可以绑定到接受 A 并返回 Monad 类型为 B 的函数。我可以根据value_type typedef 定义A,但是如何在我的概念中定义类型B?
template <typename M>
concept bool Monad()
{
return requires(M m, Function<_1, ValueType<M>> f) {
// (>>=) :: m a -> (a -> m b) -> m b
{ m >>= f } -> M
}
}
在上面的例子中,我应该用什么来代替 Function 概念中的_1?
这是否也足以将调用 f 的结果限制为任何类型的 Monad?
【问题讨论】:
-
顺便说一句,(ab)在这里使用
operator>>=似乎是一个错误。在 C++ 中,a >>= b >>= c关联为a >>= (b >>= c),而在 Haskell 中,它关联为(a >>= b) >>= c。 -
是的,我知道 :) 显然不是值得生产的代码——只是玩游戏来学习一些概念
标签: c++ generic-programming c++17 c++-concepts