haskell(8)

来源:互联网 发布:node sass作用 编辑:程序博客网 时间:2024/05/01 15:46

本博客所有内容是原创,未经书面许可,严禁任何形式的转载。

http://blog.csdn.net/u010255642



8、元组

元组和列表相似,但不同的是元组内的元素类型不要求一致,而且元素个数是确定的。

使用双重列表可以解决不定长多维数组的构造需要

*Main> let myarray1=[[1,2],[3,4,5],[5,6,7,8]]

*Main> let myarray2=[(1,2),(3,4),(5,6)]

*Main> myarray1

[[1,2],[3,4,5],[5,6,7,8]]

*Main> myarray2

[(1,2),(3,4),(5,6)]

*Main> myarray2!!2

(5,6)

*Main> myarray1!!2

[5,6,7,8]

*Main>
   元组可以方便得实现一些特殊的要求,比如说,多维数组,每一维度的元素和类型都一样,因为元组做为列表的元素要求元组内元素内型一致,然后长度一致

*Main> let myarray2=[(1,2),(3,4),(5,6)]

*Main> myarray2

[(1,2),(3,4),(5,6)]

*Main> myarray2!!2

(5,6)

*Main>

带约束条件,生成以元组为元素的列表

Prelude> let mylist=[(x,y,z)|x<-[1..5],y<-[1..5],z<-[1..5],x*y==z]

Prelude> mylist

[(1,1,1),(1,2,2),(1,3,3),(1,4,4),(1,5,5),(2,1,2),(2,2,4),(3,1,3),(4,1,4),(5,1,5)]

Prelude>


我们可以尝试一些错误的做法,都无法成功:

*Main> let myarray2=[(1,'a'),(3,4),(5,6)]

<interactive>:46:26:

    No instance for (Num Char)

      arising from the literal `4'

    Possible fix: add an instance declaration for (Num Char)

    In the expression: 4

    In the expression: (3, 4)

    In the expression: [(1, 'a'), (3, 4), (5, 6)]

*Main> let myarray2=[(1,'a'),(3,4,88),(5,6)]

<interactive>:47:23:

    Couldn't match expected type `(t0, Char)'

                with actual type `(t1, t2, t3)'

    In the expression: (3, 4, 88)

    In the expression: [(1, 'a'), (3, 4, 88), (5, 6)]

    In an equation for `myarray2':

        myarray2 = [(1, 'a'), (3, 4, 88), (5, 6)]

*Main>

通过fst和snd取仅有成对元素的元组的第一个元素和第二个元素

*Main> let myarray2=[(1,'a'),(3,'b'),(5,'c')]

*Main> myarray2!!2

(5,'c')

*Main> fst(myarray2!!2)

5

*Main> snd(myarray2!!1)

'b'

Zip从列表生成成对元素的元组

*Main> zip [1,2,3,4] ["aa","bb","cc"]

[(1,"aa"),(2,"bb"),(3,"cc")]

*Main>

原创粉丝点击