提问者:小点点

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


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个答案

匿名用户

我对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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(haskell|模板|专门化|中|模仿|c++|类型|结构|模式)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?