我遇到过对Haskell的引用Data.Typeable,但我不清楚为什么我想在我的代码中使用它.
它解决了什么问题,怎么解决?
haskell generic-programming typeclass scrap-your-boilerplate
python如何处理通用/模板类型场景?假设我想创建一个外部文件"BinaryTree.py"并让它处理二进制树,但对于任何数据类型.
所以我可以传递一个自定义对象的类型,并有一个该对象的二叉树.这是如何在python中完成的?
我正在尝试在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.
我在这里错过了什么?
假设我想编写一个泛型函数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
(作为借口:标题模仿了为什么我们需要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 …
我很困惑如何在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)
很容易注意到function1并function2做同样的事情,唯一不同的部分是内部功能.
因此,我想制作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)
一切都好.但是我遇到了一个问题:我还可以做,如果a和b …
这不完全是一个技术问题,因为我知道C有足够的东西来做我需要的东西(我的意思是,不是'让语言妨碍你'),所以这个问题基本上是'什么方向'采取'问题.
情况是:我目前正在学习高级算法课程,并且为了"成长为程序员",我需要使用纯C来实现实际任务(它运作良好:几乎任何小错误你实际上都是你完全理解你正在做什么来解决它).在实现过程中,我显然遇到了必须从头开始实现"基本"数据结构的问题:实际上不仅是链表,还有堆栈,树等等.
我专注于本主题中的列表,因为它通常是一个结构,我最终在程序中使用了很多,作为"主"结构或作为其他更大的结构的"帮助"结构(例如,一个哈希树,可以解决使用链表冲突).
这要求列表存储许多不同类型的元素.我假设这里作为一个前提,我不想为每种类型重新编码列表.所以,我可以提出这些替代方案:
要明确问题:上述哪一个最好?
PS:由于我基本上处于学术背景中,因此我对在行业中使用纯C的人的观点也非常感兴趣.我知道大多数纯C程序员都在嵌入式设备领域,我不认为我面临的这种问题很常见.但是,如果那里的任何人知道它是如何"在现实世界中"完成的,我会对你的意见非常感兴趣.
我正在学习Haskell,类型类似乎是一种强大的类型安全多态函数.但是很多Haskell Prelude函数都没有使用它们.进一步来说:
大多数列表功能不与其他数据结构的工作(例如,foldr并且length只对列表实现,不能在阵列中使用).
Data.ByteString除非您使用,否则类似的模块不可用,import qualified因为它们包含与Prelude函数具有相同名称的函数.
如果标准库使用类型类的泛型函数,似乎这两个问题都会消失(请告诉我,如果我完全不在此基础上).
我有两个问题:
Prelude是否有这样的技术或设计理由,还是出于历史原因?
环顾四周,看起来有几个库(比如
Data.Foldable,如果我没有弄错的话,Scrap Your Boilerplate)用标准替代品替换标准的Prelude函数.有没有计划将这些想法融入Haskell的未来版本?
我在"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++ ×4
haskell ×3
templates ×3
agda ×1
c ×1
c++-concepts ×1
c++17 ×1
containers ×1
dry ×1
g++ ×1
kotlin ×1
linked-list ×1
polymorphism ×1
python ×1
type-theory ×1
typeclass ×1