检查haskell中是否为元组或三元组

che*_*ire 0 haskell

有没有办法检查有多少元素(,)?我知道我可以访问的元组的第一和第二个元素与fstsnd,但是,我想我能以某种方式和元素,然后将其与FST元组SND元组比较和检查是这样的:

tuple = (1,2)

sum tuple == fst tuple + snd tuple
Run Code Online (Sandbox Code Playgroud)

然后我为这个案子得到了真,并得到了假triple = (1,2,3).无论如何,我无法问fst (1,2,3)我也不能做sum tuple

有没有办法检查我是否有元组?

像这样的东西:

is_tuple :: (a,b) -> a
is_tuple (a,_) = a
Run Code Online (Sandbox Code Playgroud)

但是当我输入元组时得到True而当我给(1,2,3)或(1,2,3,4)等等时......作为输入.

即:

is_tuple :: Tuple -> Bool
is_tuple x = if x is Tuple 
                then True
                else False
Run Code Online (Sandbox Code Playgroud)

Ale*_*ing 7

有没有办法检查有多少元素(,)

不,因为答案总是2.

类型(,)是两个值的元组的类型构造函数,或者是2元组.它是一个独特的类型(,,),3元组的构造函数.同样,这两种类型都不同于(,,,)4元组的构造函数,依此类推.

当你编写一个带有类型的函数时,类型(Foo, Bar) -> Baz检查器会拒绝任何用不同数量的元组(或根本不是元组的东西)调用函数的尝试.因此,您的isTuple函数只有一个逻辑实现,

isTuple :: (a, b) -> Bool
isTuple _ = True
Run Code Online (Sandbox Code Playgroud)

...因为实际上不可能isTuple使用不是2元组的值进行调用.

在不使用类型类的情况下,在Haskell中编写一个接受任意大小的元组的函数是不可能的; 也就是说,你不能对元组的大小进行多态化.这是因为,与列表不同,元组是异构的 - 它们可以包含不同类型的值.接受不同长度的元组的函数无法预测元组的哪些元素属于哪种类型,因此无法实际执行任何有用的操作.

很少,在进行高级的类型级别欺骗时,拥有一个表示不同长度元组的类型会很有用,这在Haskell中经常被称为HList(用于异构列表).这些可以使用花哨的类型类机制和类型级编程实现为库.但是,如果你是初学者,这绝对不是你想要的.

实际上很难就你该做什么提出建议,因为正如评论者指出的那样,你的问题就像一个XY问题.考虑一个不同的问题,提供一些关于您实际尝试解决的问题的更多背景信息,这使您想要首先找到元组列表,并且您很可能会获得更多有用的答案.