跟大部分語言的 Tuple 一樣就是可以把多種資料型態塞進一個容器來表示資料的型別,像是 ("Todd",100,True)
他的型別就是 (String,Num,Bool)
。
那假設我們今天要描述一個三角形可能會是這樣 (Double, Double, Double)
,
fst
可以回傳的首項
fst ("Todd",False) -- "Todd"
snd
可以回傳的尾項
snd ("Todd",False) -- False
zip
可以把兩個 List 組成一個 tuple list。
zip [1..3] [True,True,True] -- [(1,True),(2,True),(3,True)]
那如果兩個 List 長度不一樣呢?
zip [1..] [True,True,True,True,True]
-- [(1,True),(2,True),(3,True),(4,True),(5,True)]
zip [1..] ['A'..'Z']
-- [(1,'A'),(2,'B'),(3,'C'),(4,'D'),(5,'E'),(6,'F'),(7,'G'),(8,'H'),(9,'I'),(10,'J'),(11,'K'),(12,'L'),(13,'M'),(14,'N'),(15,'O'),(16,'P'),(17,'Q'),(18,'R'),(19,'S'),(20,'T'),(21,'U'),(22,'V'),(23,'W'),(24,'X'),(25,'Y'),(26,'Z')]
會發現主要是會根據短的 List 去匹配。
當然我們可以把之前介紹過語法拿來跟 tuple 一起使用。
像是我們用來產生描述等腰三角形的 List
[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a==b || a==c || b==c ]
也可以利用 pattern matching ,來匹配對應的元素
triangleType :: (Double, Double, Double) -> String
triangleType (a, b, c)
| a == b && b == c = "Equilateral"
| a == b || b == c || a == c = "Isosceles"
| otherwise = "Isosceles"
這邊可以看到 我們用 (a,b,c)
可以分別匹配到這個 tuple的第一二三項
今天本來想開始講 algebraic data types (ADT) 但礙於最近真的有點忙只好先寫一篇篇幅較小的文章,但雖然 tuple 簡單歸簡單卻是我們學習 ADT 的入門磚,畢竟 tuple 能夠描述的情況還不夠複雜所以我們才會需要 ADT 來描述更複雜的資料型態。
至於那到底是什麼,我們以後再來好好瞭解吧。