标签: generic-programming

什么是Haskell的Data.Typeable?

我遇到过对Haskell的引用Data.Typeable,但我不清楚为什么我想在我的代码中使用它.

它解决了什么问题,怎么解决?

haskell generic-programming typeclass scrap-your-boilerplate

72
推荐指数
4
解决办法
6649
查看次数

python中的泛型/模板?

python如何处理通用/模板类型场景?假设我想创建一个外部文件"BinaryTree.py"并让它处理二进制树,但对于任何数据类型.

所以我可以传递一个自定义对象的类型,并有一个该对象的二叉树.这是如何在python中完成的?

python templates generic-programming

62
推荐指数
5
解决办法
8万
查看次数

如何检查Kotlin中的泛型类型

我正在尝试在Kotlin中测试通用类型.

if (value is Map<String, Any>) { ... }
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨

无法检查已擦除类型的实例:jet.Map

普通类型的检查效果很好.

if (value is String) { ... }
Run Code Online (Sandbox Code Playgroud)

使用Kotlin 0.4.68.

我在这里错过了什么?

generic-programming kotlin

55
推荐指数
3
解决办法
2万
查看次数

在部分专用类上标记调度与静态方法

假设我想编写一个泛型函数void f<T>(),如果T是POD类型则执行一项操作,如果T是非POD(或任何其他任意谓词)则执行另一项操作.

实现此目的的一种方法是使用标签库调用模式,如标准库与迭代器类别一样:

template <bool> struct podness {};
typedef podness<true> pod_tag;
typedef podness<false> non_pod_tag;

template <typename T> void f2(T, pod_tag) { /* POD */ }
template <typename T> void f2(T, non_pod_tag) { /* non-POD */ }

template <typename T>
void f(T x)
{
    // Dispatch to f2 based on tag.
    f2(x, podness<std::is_pod<T>::value>());
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用部分专用类型的静态成员函数:

template <typename T, bool> struct f2;

template <typename T>
struct f2<T, true> { static void f(T) { /* POD */ …
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming partial-specialization generic-programming

47
推荐指数
3
解决办法
8883
查看次数

如何使用C++概念("concepts lite")支持构建gcc?

C++标准委员会正在研究概念扩展的TS(技术规范):"Programming Languages - C++ Extensions for Concepts".N4377是本文档的最新版本.为了包含在C++标准中,要求实现功能,理想情况是可公开访问的系统.

我知道概念-gcc,但上面的概念提议(通俗地称为Concepts Lite)是不同的.我听说有一个概念的分支,我已经尝试了origin/asutton/c++-conceptsGCCgit镜,但没有编制.如何构建和使用上述[草案] TS中指定的gcc支持概念版本?

c++ g++ generic-programming c++-concepts c++17

39
推荐指数
2
解决办法
7364
查看次数

为什么我们需要容器?

(作为借口:标题模仿了为什么我们需要monad?)

容器(和索引的)(和无用的)和描述.但是容器是有问题的,根据我很小的经验,就容器而言,比描述更难以思考.非索引容器的类型是同构的?- 这是非常不明确的.形状和位置描述有帮助,但在

?_?? : ? {? ? ?} -> Container ? ? -> Set ? -> Set (? ? ? ? ?)
? Sh ? Pos ?? A = ? ? sh -> Pos sh -> A

K? : ? {? ?} -> Set ? -> Container ? ?
K? A = A ? const (Lift ?)
Run Code Online (Sandbox Code Playgroud)

我们本质上是使用?而不是形状和位置.

容器上的严格正面免费monad的类型有一个相当简单的定义,但Freermonad 的类型对我来说看起来更简单(在某种意义上,Freer …

haskell type-theory generic-programming agda dependent-type

35
推荐指数
1
解决办法
1116
查看次数

模板函数作为模板参数

我很困惑如何在C++中以通用方式实现某些东西.这有点令人费解,所以让我一步一步解释.


考虑这样的代码:

void a(int) {
    // do something
}
void b(int) {
    // something else
}


void function1() {
    a(123);
    a(456);
}
void function2() {
    b(123);
    b(456);
}

void test() {
    function1();
    function2();
}
Run Code Online (Sandbox Code Playgroud)

很容易注意到function1function2做同样的事情,唯一不同的部分是内部功能.

因此,我想制作function通用的以避免代码冗余.我可以使用函数指针或模板来完成它.我现在就选择后者.我的想法是,它更好,因为编译器肯定能够内联函数 - 我是否正确?编译器是否可以通过函数指针进行内联调用?这是一个侧面问题.

好的,回到原点...带模板的解决方案:

void a(int) {
    // do something
}
void b(int) {
    // something else
}

template<void (*param)(int) >
void function() {
    param(123);
    param(456);
}

void test() {
    function<a>();
    function<b>();
}
Run Code Online (Sandbox Code Playgroud)

一切都好.但是我遇到了一个问题:我还可以做,如果ab …

c++ templates dry generic-programming

31
推荐指数
2
解决办法
1万
查看次数

纯C中的"多用途"链表实现

这不完全是一个技术问题,因为我知道C有足够的东西来做我需要的东西(我的意思是,不是'让语言妨碍你'),所以这个问题基本上是'什么方向'采取'问题.

情况是:我目前正在学习高级算法课程,并且为了"成长为程序员",我需要使用纯C来实现实际任务(它运作良好:几乎任何小错误你实际上都是你完全理解你正在做什么来解决它).在实现过程中,我显然遇到了必须从头开始实现"基本"数据结构的问题:实际上不仅是链表,还有堆栈,树等等.

我专注于本主题中的列表,因为它通常是一个结构,我最终在程序中使用了很多,作为"主"结构或作为其他更大的结构的"帮助"结构(例如,一个哈希树,可以解决使用链表冲突).

这要求列表存储许多不同类型的元素.我假设这里作为一个前提,我不想为每种类型重新编码列表.所以,我可以提出这些替代方案:

  • 制作一个void指针列表(有点不优雅;更难调试)
  • 只有一个列表,但是有一个联合作为'元素类型',包含我将在程序中使用的所有元素类型(更容易调试;如果元素的大小不同,则浪费空间)
  • 使用预处理器宏为SGLIB样式重新生成每种类型的代码,"模仿"C++的STL(创造性解决方案;不浪费空间;元素具有返回时实际的显式类型; 列表中的任何更改代码可以真的很戏剧化)
  • 你的想法/解决方案

要明确问题:上述哪一个最好?

PS:由于我基本上处于学术背景中,因此我对在行业中使用纯C的人的观点也非常感兴趣.我知道大多数纯C程序员都在嵌入式设备领域,我不认为我面临的这种问题很常见.但是,如果那里的任何人知道它是如何"在现实世界中"完成的,我会对你的意见非常感兴趣.

c containers linked-list generic-programming

28
推荐指数
4
解决办法
7748
查看次数

为什么Haskell标准库不能更多地使用多态?

我正在学习Haskell,类型类似乎是一种强大的类型安全多态函数.但是很多Haskell Prelude函数都没有使用它们.进一步来说:

  • 大多数列表功能不与其他数据结构的工作(例如,foldr并且length只对列表实现,不能在阵列中使用).

  • Data.ByteString除非您使用,否则类似的模块不可用,import qualified因为它们包含与Prelude函数具有相同名称的函数.

如果标准库使用类型类的泛型函数,似乎这两个问题都会消失(请告诉我,如果我完全不在此基础上).

我有两个问题:

  1. Prelude是否有这样的技术或设计理由,还是出于历史原因?

  2. 环顾四周,看起来有几个库(比如 Data.Foldable,如果我没有弄错的话,Scrap Your Boilerplate)用标准替代品替换标准的Prelude函数.有没有计划将这些想法融入Haskell的未来版本?

polymorphism haskell generic-programming

28
推荐指数
4
解决办法
1966
查看次数

"typename ="在模板参数中的含义是什么?

我在"Effective Modern C++"一书的第189页中看到过这个表达式:

    template<typename T,
             typename = typename std::enable_if<condition>::type>
    explicit Person(T&& n);
Run Code Online (Sandbox Code Playgroud)

我只是想知道" typename =" 这个部分是什么意思.它当然看起来像模板参数的默认参数.但是你不需要typename some_name = ...在默认参数中使用" " 这样的东西吗?第二个模板参数没有名称,我没有看到在这种情况下使用的第二个模板参数.

PS当我在谷歌(或任何其他搜索引擎)上搜索答案时,等号总是被丢弃,这只是让找到答案几乎不可能......

c++ templates metaprogramming generic-programming

28
推荐指数
1
解决办法
2506
查看次数