当前位置: 首页 > 知识库问答 >
问题:

在Haskell(模板专门化)中,可以模仿C++的“对应”类型结构模式吗?

司马项明
2023-03-14
template <typename T>
struct Corresponding;

template <>
struct Corresponding<int> {
    using CorrespondingT = boost::multiprecison::cpp_int;
};
template <typename T> using GetCorresponding = typename Corresponding<T>::CorrespondingT;

这可以用作

static_assert(std::is_same_v<GetCorresponding<int>, boost::multiprecision::cpp_int>); // true

其中,对应 是包含具有对应类型t的别名的结构,该别名在编译时解析。这方面的另一个示例是std::remove_ptr_t ,它对应于t

我能在Haskell做一些类似的事情吗,例如。

iAmAnInteger :: getCorresponding Int -- Integer

我不熟悉Haskell的编译时类型功能,但这可能吗?

共有1个答案

姬天逸
2023-03-14

我对C++不是很流利,所以我不能百分之百确定您的示例代码在做什么,但乍一看,类型族和等式似乎是相似的。

{-# LANGUAGE TypeFamilies #-}

type family Corresponding a
type instance Corresponding Int = Integer

foo :: Corresponding Int ~ Integer => ()
foo = () -- compiles

bar :: Corresponding Int ~ Bool => ()
bar = () -- type error at any use site

baz :: Corresponding Int
baz = toInteger 3 -- compiles

quux :: Corresponding Int
quux = False -- type error
 类似资料:
  • 还尝试在专门化的中进行模板方法专门化: 这一次它编译,但调用原始方法,即 解决方案

  • 我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。

  • 我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?

  • 关于下一个代码,我有一些问题: > 类专业化

  • 我有一个模板基类,其模板参数类型为bool。此基类的构造函数参数列表取决于模板参数是true还是false。我想从这个类派生另一个模板类,它的模板参数是任意类型的。我需要这个派生类根据该类型的特征调用该基类的正确构造函数。 下面的例子并不包罗万象。无论是否为整数,基类模板bool可以是任何类型trait。此外,传递给派生类的模板参数的类型可以是任何类型。

  • 我有一段代码,它是做模板专门化的常用模式。为了移除main函数第一行中为Processor1指定DataType1的要求,我想改为接收一个template模板参数。看起来using指令不支持分配“open”模板参数,而且我在web中找不到任何这样的示例(可能我没有使用适当的关键字进行搜索...) 所以问题很“简单”,我如何让这段代码编译呢?在FindDefaultProcessor中,使用type