我是Haskell的新手,目前正在寻找一种方法来提取或删除元组中的第一个Int
。是否有内置的Haskell功能?
例如:
tuple :: (Int)
tuple = (1,2,3,4,5)
tuple !! 0 =
答案 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)
。
这样做的原因是定义中的每个文字(1
,2
等)都可以解释为任何这些类型,当你编写这样的表达式时,编译器让你的选择保持开放。
如果您希望它是一个完全由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中的fst
和snd
分别获取第一个和第二个元素