haskell類型基礎

1灿巧, haskell是靜態(tài)類型語言,大部分情況依靠類型推斷而不需要顯示指定類型。

-- Int類型32bit或64bit丈探,超過范圍返回0
x :: Int 
x= 2

-- Integer范圍無限
y :: Integer
y= 2

letter :: Char
letter = 'a'

interestRate :: Double
interestRate = 0.375

isFun :: Bool
isFun = True

-- list類型元素必須是同一種類型
values :: [Int]
values = [1, 2, 3]

testScores :: [Double]
testScores = [0.99, 0.7, 0.8]

letters :: [Char]
letters = ['a', 'b', 'c']

-- String本質(zhì)上就是[Char]類型
aPet :: [Char]
aPet = "cat"
anotherPet :: String
anotherPet = "dog"

-- tuple可以包含不同類型的元素
ageAndHeight ::(Int, Int)
ageAndHeight = (34, 74)
firstLastMiddle :: (String, String, Char)
firstLastMiddle = ("Oscar", "Grouch", 'D')
streetAddress :: (Int, String)
streetAddress = (123, "Happy St.")

-- 函數(shù)類型,haskell不支持自動類型轉(zhuǎn)換
half :: Int -> Double
half n = (fromIntegral n) / 2

-- show把任意類型轉(zhuǎn)成字符串
main :: IO ()
main = print $ show 6

-- read把字符串類型轉(zhuǎn)為其他類型
number = read "6" :: Int
anotherNumber :: Int
anotherNumber = read "6"

-- 多參數(shù)函數(shù)崭孤,最后一個是返回值類型
makeAddress :: Int -> String -> String -> (Int, String, String)
makeAddress number street town = (number, street, town)
-- partial application
makeAddressLambda = (\number ->
                        (\street ->
                            (\town -> (number, street, town)))

-- 函數(shù)參數(shù)類型加小括號
ifEven :: (Int -> Int) -> Int -> Int
ifEven f n = if even n
             then f n 
             else n

-- 類型聲明中任何小寫字符都可以表示任意類型(類似泛形)
simple :: a -> a
simple x = x

-- 相同字母表示同一種類型类嗤,不同字母可以表示同一種類型
makeTriple :: a -> b -> c -> (a, b, c)
makeTriple x y z = (x, y, z)

2, 自定義類型

2.1 type定義類型別名辨宠,相當于c++中的typedef/using

patientInfo :: String -> String -> Int -> Int -> String 
patientInfo fname lname age height = name ++ " " ++ ageHeight
  where name = lname ++ ", " ++ fname
        ageHeight = "(" ++ show age ++ "yrs. " ++ show height ++ "in.)"

type FirstName = String
type LastName = String
type Age = Int
type Height = Int
patientInfo :: FirstName -> LastName -> Age -> Height -> String

2.2 data自定義類型(相當于c中的struct)

自定義類型.png

data是關鍵字遗锣,=號左邊是類型構(gòu)造,可以帶參數(shù)定義泛形類型嗤形。=號右邊是數(shù)據(jù)構(gòu)造精偿,用于構(gòu)造類型實例,多個數(shù)據(jù)構(gòu)造用|分割赋兵。類型構(gòu)造和數(shù)據(jù)構(gòu)造的名稱不要求相同笔咽。

type FirstName = String
type MiddleName = String
type LastName = String
-- 數(shù)據(jù)構(gòu)造名稱后面是參數(shù)類型
data Name = Name FirstName LastName
       | NameWithMiddle FirstName MiddleName LastName

-- 模式匹配
showName :: Name -> String
showName (Name f l) = f ++ " " ++ l
showName (NameWithMiddle f m l) = f ++ " " ++ m ++ " " ++ l

name1 = Name "Jerome" "Salinger"
name2 = NameWithMiddle "Jerome" "David" "Salinger"
showName name1 = "Jerome Salinger"
showName name2 = "Jerome David Salinger"

-- record語法,用于字段較多的情況
data Patient = Patient { name :: Name
                    , sex :: Sex
                    , age :: Int
                    , height :: Int
                    , weight :: Int
                    , bloodType :: BloodType }

jackieSmith :: Patient
jackieSmith = Patient {name = Name "Jackie" "Smith"
                   , age = 43
                   , sex = Female
                   , height = 62
                   , weight = 115
                   , bloodType = BloodType O Neg }

-- getter:每個字段的類型都是:字段所在類型 -> 字段類型
height jackieSmith = 62
-- setter:返回一個新對象
jackieSmithUpdated = jackieSmith { age = 44 }

3霹期,type classes(相當于java中的interface)

type classes.png
-- 定義type classes
class Eq a where
   (==) :: a -> a -> Bool
   (/=) :: a -> a -> Bool

-- Ord繼承Eq
class Eq a => Ord a where
   compare :: a -> a -> Ordering
   (<) :: a -> a -> Bool
   (<=) :: a -> a -> Bool
   (>) :: a -> a -> Bool
   (>=) :: a -> a -> Bool
   max :: a -> a -> a
   min :: a -> a -> a

-- 調(diào)用type classes函數(shù)
min 1 2 = 2

-- type classes可以定義字段叶组,相當于無參函數(shù)
class Bounded a where
   minBound :: a
   maxBound :: a

-- 訪問type classes的字段需要指定實現(xiàn)類
minBound :: Int = -9223372036854775808

-- 自動實現(xiàn)內(nèi)置的type classed(相當于java中從Object繼承equals和toString)
data Icecream = Chocolate | Vanilla deriving (Show, Eq, Ord)

-- type classes多繼承?历造?甩十?
-- type classes函數(shù)默認實現(xiàn)船庇??侣监?

type實現(xiàn)type classed

class Show a where
   show :: a -> String

data SixSidedDie = S1 | S2 | S3 | S4 | S5 | S6

instance Show SixSidedDie where
    show S1 = "one"
    show S2 = "two"
    show S3 = "three"
    show S4 = "four"
    show S5 = "five"
    show S6 = "six"

多態(tài):

read.png

核心type classes層次結(jié)構(gòu)

type classes層次結(jié)構(gòu).png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸭轮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子橄霉,更是在濱河造成了極大的恐慌窃爷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姓蜂,死亡現(xiàn)場離奇詭異按厘,居然都是意外死亡,警方通過查閱死者的電腦和手機钱慢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門刻剥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滩字,你說我怎么就攤上這事∮蹋” “怎么了麦箍?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長陶珠。 經(jīng)常有香客問我挟裂,道長,這世上最難降的妖魔是什么揍诽? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任诀蓉,我火速辦了婚禮,結(jié)果婚禮上暑脆,老公的妹妹穿的比我還像新娘渠啤。我一直安慰自己,他們只是感情好添吗,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布沥曹。 她就那樣靜靜地躺著,像睡著了一般碟联。 火紅的嫁衣襯著肌膚如雪妓美。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天鲤孵,我揣著相機與錄音壶栋,去河邊找鬼。 笑死普监,一個胖子當著我的面吹牛贵试,可吹牛的內(nèi)容都是我干的琉兜。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼锡移,長吁一口氣:“原來是場噩夢啊……” “哼呕童!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淆珊,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤夺饲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后施符,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體往声,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年戳吝,在試婚紗的時候發(fā)現(xiàn)自己被綠了浩销。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡听哭,死狀恐怖慢洋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陆盘,我是刑警寧澤普筹,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站隘马,受9級特大地震影響太防,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酸员,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一蜒车、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幔嗦,春花似錦酿愧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呼渣,卻和暖如春棘伴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屁置。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工焊夸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓝角。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓阱穗,卻偏偏與公主長得像饭冬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子揪阶,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容