gpt4 book ai didi

c++ - 有没有人尝试在 C++ 中实现类似 Haskell 的 case-of 语句?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:49 25 4
gpt4 key购买 nike

我想知道是否有人知道这个的实现(或尝试实现)。

在 Haskell 中

Haskell 有一个通过模式匹配来区分大小写的表达式:

let a = [1,2,3] in
let is_empty = case a of
[] -> True
(_:_) -> False in
-- Note: is_empty == False
...

在 C++ 中

C++ 重载决议的作用类似于模式匹配。人们总是可以定义一个重载集来对类型进行大小写区分,但在许多情况下使用表达式会更方便。

我可以看到这几乎如何在 C++14 中工作:

template<typename Head, typename Tail>
using Cons = boost::tuples::cons<Head, Tail>;
using Nil = boost::tuples::null_type;

template<typename Tuple>
bool is_empty(Tuple const & tuple)
{
return case_of(tuple)(
[](Cons<auto,auto> const &) { return false; }
, [](Nil) { return true; }
);
}

但我不认为Cons<auto,auto> (或类似的东西)在任何版本的 C++ 中都有效。我们有通用的 lambda,但在这种情况下,我想在 lambda 中进行模板参数推导。

那么,在野外有没有像这种 case_of 的东西?或者有人知道一次失败的尝试吗?

或者您能看到如何实现我想要的模式匹配吗?它必须完全包含在表达式中。

最佳答案

去年在俄罗斯 Habrahabr 网站上有一篇关于 C++ 中某种模式匹配的文章。它允许您匹配类型(是的,更像是类型匹配),甚至可以匹配某些 bool 编译时条件。它看起来像这样:

template<class T>
decltype(auto) test(T& value) {
return match(value
,[](std::string value) { cout << "This is string"; return value + " Hi!"; }
,[](int i) { cout << "This is int"; return i * 100; }
,[](auto a) { cout << "This is default";return nullptr; }
);
}

match(true_type{}
,[](bool_constant< T::value == 10 >) { cout << "1" ; }
,[](bool_constant< (T::value == 20 && sizeof...(Args)>4) >) { cout << "2" ; }
);

您可以在blog post itself 中找到更多代码片段和实现细节。 .这篇博文的灵感来自这个 C++ Mach7博客文章作者在某些地方认为它是相当丑陋的库,但允许你写这样的东西:

// Fibonacci numbers
int fib(int n)
{
var<int> m;

Match(n)
{
Case(1) return 1;
Case(2) return 1;
Case(2*m) return sqr(fib(m+1)) - sqr(fib(m-1));
Case(2*m+1) return sqr(fib(m+1)) + sqr(fib(m));
}
EndMatch
}

但是不知道列表。您可能会寻找其他答案和/或实现您的自定义列表匹配器。

关于c++ - 有没有人尝试在 C++ 中实现类似 Haskell 的 case-of 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42404734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com