初識Haskell 五:自定義數據類型和類型類


Discrete Mathematics Using a Computer的第一章Introduction to Haskell進行總結。環境Windows。

2020.3.13 更新:COMP90048 Declarative Programming 又繼續學習了Haskell。


類型別名 type synonym

 作用和C中的typedef差不多,形式如:

  type Message = (String, Int)

  首字母大寫。

自定義數據類型 data type definitions

  形式如:

    data Colour = Red | Orange | Yellow | Green | Blue | Violet

  Colour type包含了Red Orange Yellow Green Blue Violet這些值,這些值是constructor,其開頭字母要大寫。

  還有包含類型變量type variables的形式data constructors:

  data Point = Pt Float Float --這里Pt就是data constructor,更通常的是把type和data constructor寫成一樣的,即data Point = Point Float Float

  為type指定默認類型在末尾deriving

  data MyBool = MyTrue | MyFalse

    deriving (Eq, Show)

如果要為type指定自定義類型,則要單獨定義,如:

data Location = Location (Int, Int) deriving (Eq, Ord)

-- Define Location show, e.g. Location (1, 1) is shown as "A1"
instance Show Location where
    -- convert col and row to ['A'..'H'] and [1..4]
    show (Location (col, row)) = [chr (64 + col), intToDigit row]

 自定義類型類 type class

  從 + 操作說起,+可以作用於許多類型如整形和浮點型等,其得出的結果類型也不是單一的,這就有個問題:+的類型是什么?如果是(+) :: Integer -> Integer -> Integer的話,則當浮點數相加時是不符合的,而如果是(+) :: a -> a -> a就意味着任何類型都適用,如True + False,這也不對,我們想要的是當類型是數字numeric時適用,實際上(+)的定義為:

  (+) :: Num a => a -> a -> a

  Num是類型類type class,Num包括Int, Integer, Float, Double等類型。Num a =>稱為類限制(class constraint or context),表示只有當參數的類型是屬於Num時(+)才適用。除了Num還有其他的type class:

  Ord用於比較

  Haskell允許自定義類型類,常用的類型類有Num, Show, Eq。Num表示該類是數字numeric,Show表示可轉換成字符串,Eq表示可用於比較是否相等。

Type Constructors

  data List a = ListNode a (List a) | ListEnd

Maybe

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM