首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查haskell中的元组还是三元组

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

Stack Overflow用户
提问于 2018-11-18 21:54:14
回答 1查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
tuple = (1,2)

sum tuple == fst tuple + snd tuple

然后,我在这个案例中得到了真,对于triple = (1,2,3),我得到了假。不管怎样,我不能问fst (1,2,3),也不能做sum tuple

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

就像这样:

代码语言:javascript
复制
is_tuple :: (a,b) -> a
is_tuple (a,_) = a

但是当我输入元组时得到真,当我给出(1,2,3)或(1,2,3,4)等等时,得到假.作为投入。

即:

代码语言:javascript
复制
is_tuple :: Tuple -> Bool
is_tuple x = if x is Tuple 
                then True
                else False
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-19 00:30:28

有方法检查(,)有多少元素吗?

不,因为答案总是2。

类型(,)是两个值或两个元组的元组的类型构造函数.它是一个与(,,)不同的类型,它是三元组的构造函数。同样,这两种类型都不同于(,,,),即4元组的构造函数,等等。

当您使用(Foo, Bar) -> Baz类型编写函数时,打字机将拒绝使用不同值的元组(或根本不是元组的内容)调用函数的任何尝试。因此,您的isTuple函数只有一个逻辑实现,

代码语言:javascript
复制
isTuple :: (a, b) -> Bool
isTuple _ = True

…因为不可能用一个不是二元组的值来实际调用isTuple

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

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

实际上很难给出你应该做什么的建议,因为正如一位评论者所指出的,你的问题读起来像an XY problem。考虑问一个不同的问题,它提供了更多关于你实际上试图解决的问题的背景,这使得你首先想找到一个元组的列表,你很可能会得到更有帮助的答案。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53365842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档