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

Haskell:将任何数据类型匹配到元组的函数,haskell,Haskell,我在寻找一个函数,它接受任何数据类型,只匹配元组,如果输入不是元组,则抛出一个错误。我的想法是这样的: transformTuple :: t -> (a,b) transformTuple (a,b) = (a,b) transformTuple _ = error "no tuple" 这不起作用,因为在第2行(a,b)中,与t匹配,显然不起作用。很可能您做得不对,如果做得正确,您将不需要这样的功能。请注意,您正在用运行时错误替换类型检查错误 也就是说,您可以使用类型类来实现,并且如

我在寻找一个函数,它接受任何数据类型,只匹配元组,如果输入不是元组,则抛出一个错误。我的想法是这样的:

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

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

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

也就是说,您可以使用类型类来实现,并且如果有足够的上下文进行类型推断(或者如果您添加了类型注释):

然后:


这看起来像是一个XY问题:你打算在哪里使用这个东西?我只是在学习haskell,我在四处摆弄来测试我的理解力。在这种情况下,我建议你假装上面的任务没有解决方案。Haskell(和许多其他语言)的一个关键特性是在运行时删除类型。如果函数的类型为
f::t->…
,则它不能检查类型
t
,因为在运行时没有关于该类型的信息。这提高了性能(无需保留类型信息),并确保了一个强大的理论属性,称为Parametericity(暂时忽略此属性)。非常感谢!这就是我需要的信息!当空参数是可能的时候,我使用maybe?什么是“空参数”?
{-# 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)