iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
Software Development

Haskell 從入門到放棄系列 第 13

[Haskell 從入門到放棄] Day13 - Tuple

  • 分享至 

  • xImage
  •  

Tuple 簡單介紹

跟大部分語言的 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 來描述更複雜的資料型態。

至於那到底是什麼,我們以後再來好好瞭解吧。


上一篇
[Haskell 從入門到放棄] Day 12 - lazy…evaluation…
下一篇
[Haskell 從入門到放棄] Day 14 - Algebraic Data Types (1)
系列文
Haskell 從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言