检查haskell中的元组还是三元组

时间:2018-11-18 21:54:14

标签: haskell

是否可以检查(,)有多少个元素?我知道我可以使用fstsnd访问元组的第一个和第二个元素,但是我想我可以以某种方式求和元素,然后将其与fst tuple snd tuple进行比较,并进行如下检查:

tuple = (1,2)

sum tuple == fst tuple + snd tuple

,然后在这种情况下我为True,triple = (1,2,3)为False。无论哪种方式我都不能问fst (1,2,3)也不可以sum tuple

是否可以检查我是否有元组?

类似的东西:

is_tuple :: (a,b) -> a
is_tuple (a,_) = a

但是当我输入元组时为True,而当我输入(1,2,3)或(1,2,3,4)等时为False ...等等。

即:

is_tuple :: Tuple -> Bool
is_tuple x = if x is Tuple 
                then True
                else False

1 个答案:

答案 0 :(得分:7)

  

是否可以检查(,)有多少个元素?

否,因为答案始终是2。

类型(,)是两个值的元组或2个元组的类型构造函数。与三元组的构造函数(,,)不同。同样,这两种类型都不同于(,,,)(4元组的构造函数,依此类推)。

编写类型为(Foo, Bar) -> Baz的函数时,类型检查器将拒绝任何尝试使用具有不同数量值的元组(或根本不是元组的元组)调用该函数。因此,您的isTuple函数只有一个逻辑实现,

isTuple :: (a, b) -> Bool
isTuple _ = True

…因为不可能用非2元组的值实际调用isTuple

不使用类型类,在Haskell中不可能编写一个接受任意大小的元组的函数。也就是说,您不能在元组的大小上多态。这是因为与列表不同,元组是异构的-它们可以包含不同类型的值。接受长度可变的元组的函数将无法预测元组的哪些元素属于哪种类型,因此它实际上无法做任何有用的事情。

在进行高级的类型级别的欺骗时,很少有一种类型可以表示不同长度的元组,这在Haskell中通常被称为HList(对于异构列表)。可以使用高级类型类机制和类型级编程将它们实现为库。但是,如果您是初学者,这肯定不是您想要的东西。

实际上很难就您应该做的事情给出建议,因为正如评论者所指出的那样,您的问题读起来像an XY problem。考虑问一个不同的问题,该问题为您实际尝试解决的问题提供了更多背景信息,从而使您首先想找到一个元组列表,您很可能会获得更多有用的答案。