Haskell相当于C ++类型的对

时间:2014-05-14 15:34:26

标签: c++ haskell

我想将以下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?

也许这不是一个有用的模式。仍然很好奇并且愿意学习。

3 个答案:

答案 0 :(得分:8)

Data.Tuple中,已经有一个名为swap的函数可以满足您的需求。它的类型是:

swap :: (a, b) -> (b, a)

以下为例:

import Data.Tuple

tuple :: (Int, String)
tuple = (1, "OK")

main = putStr $ (fst . swap) tuple

Live demo

将打印OK


另一方面,对的数据构造函数是(,),可以调用(由于语法糖):

(a, b)

而不是:

(,) a b

所以你也可以翻转对的数据构造函数。例如:

flip (,)

将生成一个反向参数的数据构造函数。那样:

reversedTuple :: b -> a -> (a, b)
reversedTuple = flip (,)

main = putStr $ fst $ reversedTuple "First" "Second"

Live demo

将打印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

我不太确定这在实践中会有用。