如何从Haskell中的元组中获取Int

时间:2017-10-17 01:49:34

标签: haskell

我是Haskell的新手,目前正在寻找一种方法来提取或删除元组中的第一个Int。是否有内置的Haskell功能? 例如:

tuple :: (Int)
tuple = (1,2,3,4,5)

tuple !! 0 = 

2 个答案:

答案 0 :(得分:5)

正如OP中所定义的,tuple的类型是:

Prelude> tuple = (1,2,3,4,5)
Prelude> :t tuple
tuple
  :: (Num t4, Num t3, Num t2, Num t1, Num t) => (t4, t3, t2, t1, t)

没有类型(Int)。相反,类型为(t4, t3, t2, t1, t),其中五种类型中的每一种都必须是Num实例。可以选择多种类型,并且由于所有五种类型可以彼此独立地变化,因此类型可以是(Int, Word, Float, Integer, Int)

这样做的原因是定义中的每个文字(12等)都可以解释为任何这些类型,当你编写这样的表达式时,编译器让你的选择保持开放。

如果您希望它是一个完全由Int值组成的元组,您可以声明:

tuple :: (Int, Int, Int, Int, Int)
tuple = (1,2,3,4,5)

如果您想要元组的第一个元素,可以使用模式匹配来提取该信息:

Prelude> (x, _, _, _, _) = tuple
Prelude> x
1

上面的表达式使用通配符来忽略元组的其他四个元素,但如果你需要其中一个或多个元素,你也可以绑定到命名值:

Prelude> (x, _, z, _, _) = tuple
Prelude> z
3

正如Thomas M. DuBuisson在对OP的评论中指出的那样,除了大元组之外,其他语言结构可能会更好。

如果我冒昧猜测,我认为OP实际上是关于列表,而不是元组。某些语言(特别是动态语言)在列表和元组之间没有多大区别。这在动态语言中是有意义的,其中类型在编译时是未知的。

然而,Haskell是一种静态类型语言,列表和元组是不同的。

  • 元组是一个具有固定长度的数据结构,但您可以灵活地选择每个元素的类型。
  • 列表是具有固定元素类型的数据结构,但您可以在其中更改长度。

也许你正在寻找一个整数列表:

list :: [Int]
list = [1,2,3,4,5]

如果有这样的列表,您可以使用!!运算符来提取第一个元素:

Prelude> list !! 0
1

请注意,!!不安全,因为如果你给它一个超出范围的索引,它就会抛出异常。

答案 1 :(得分:1)

您可以使用lens库:

tuple :: (Int, Int, Int, Int, Int)
tuple = (1,2,3,4,5)

secondElement = tuple ^. _2 -- One indexed

对于具有2个元素的元组,您可以使用Prelude中的fstsnd分别获取第一个和第二个元素