我想将以下C ++代码转换为Haskell
#include <utility>
template<typename Pair>
struct inv_pair
{
typedef std::pair<
typename Pair::second_type,
typename Pair::first_type
> type;
};
inv_pair基本上反转了对的first_type和second_type。它可以如下使用
typedef std::pair<int, std::string> pair_t1;
typedef inv_pair<pair_t1>::type inv_par_t1;
// of type std::pair<std::string, int>
的Haskell
data Pair' = Pair' Int String
-- then?
也许这不是一个有用的模式。仍然很好奇并且愿意学习。
答案 0 :(得分:8)
在Data.Tuple
中,已经有一个名为swap
的函数可以满足您的需求。它的类型是:
swap :: (a, b) -> (b, a)
以下为例:
import Data.Tuple
tuple :: (Int, String)
tuple = (1, "OK")
main = putStr $ (fst . swap) tuple
将打印OK
。
另一方面,对的数据构造函数是(,)
,可以调用(由于语法糖):
(a, b)
而不是:
(,) a b
所以你也可以翻转对的数据构造函数。例如:
flip (,)
将生成一个反向参数的数据构造函数。那样:
reversedTuple :: b -> a -> (a, b)
reversedTuple = flip (,)
main = putStr $ fst $ reversedTuple "First" "Second"
将打印Second
。
答案 1 :(得分:4)
Haskell内置了元组。例如,(3, "foo")
的类型为(Int, String)
。
创建“倒置”对很容易。例如,以下函数交换一对中的两个条目:
swap (x, y) = (y, x)
及其类型可以写为
swap :: (a, b) -> (b, a)
答案 2 :(得分:1)
以下C ++类型hackery的可能的Haskell转换
template<typename Pair>
struct inv_pair
{
typedef std::pair<
typename Pair::second_type,
typename Pair::first_type
> type;
};
typedef std::pair<int, std::string> pair_t1;
typedef inv_pair<pair_t1>::type inv_pair_t1;
可能如下
{-# LANGUAGE TypeFamilies #-}
type family Swap t
type instance Swap (a,b) = (b,a)
type Pair_t1 = (Int, String)
type Inv_Pair_t1 = Swap Pair_t1
我不太确定这在实践中会有用。