Haskell:将任何数据类型与元组匹配的函数

时间:2016-07-09 11:54:34

标签: haskell

我正在寻找一个采用任何数据类型的函数,只匹配元组并在输入没有元组时抛出错误。我的想法是这样的:

transformTuple :: t -> (a,b)
transformTuple (a,b) = (a,b)
transformTuple _ = error "no tuple"

这不起作用,因为第2行(a,b)与t匹配,显然无效。

1 个答案:

答案 0 :(得分:2)

很可能你做错了,如果做得不对,你就不会需要这样的功能。请注意,您正在使用运行时错误替换类型检查错误

也就是说,你可以使用类型类实现它,如果有足够的上下文用于类型推断(或者你添加了类型注释):

{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}

class Tuple a b c where
    tuple :: a -> Maybe (b, c)

instance Tuple a b c where
    tuple _ = Nothing

instance {-# OVERLAPPING #-} Tuple (a, b) a b where
    tuple = Just

然后:

\> let a@(b, _) = (42 :: Int, 3.14 :: Double)
\> tuple a :: Maybe (Int, Int)
Nothing
\> tuple b :: Maybe (Int, Double)
Nothing
\> tuple a :: Maybe (Int, Double)
Just (42,3.14)