我正在寻找一个采用任何数据类型的函数,只匹配元组并在输入没有元组时抛出错误。我的想法是这样的:
transformTuple :: t -> (a,b)
transformTuple (a,b) = (a,b)
transformTuple _ = error "no tuple"
这不起作用,因为第2行(a,b)与t匹配,显然无效。
答案 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)