Haskell里面的 Types 和Typeclasses到底是什么東東
Bool灰羽、Int驮履、Char、Maybe 這些內(nèi)建的類型Types我們都知道廉嚼,其實(shí)函數(shù)式編程里面只有函數(shù)是“頭等公民”
我們?cè)谶^程式語(yǔ)言里熟知的類型在函數(shù)式語(yǔ)言里面并不是一成不變的玫镐,其實(shí)我們完全可以在一個(gè)內(nèi)建類型都沒有的基礎(chǔ)上把語(yǔ)言大廈建立起來,不相信怠噪,看以下Haskell代碼
data Bool = False | True
左邊的是類型名恐似,右面的就是值"構(gòu)造子",代表可能的集合。
data Int = -2147483648 | -2147483647 | ... | -1 | 0 | 1 | 2 | ... | 2147483647
左邊的是類型名傍念,右面的就是所有整數(shù)集合矫夷。
夠抽象葛闷,夠一般。
data Shape = Circle Float Float Float | Rectangle Float Float Float Float
值構(gòu)造子的本質(zhì)是個(gè)函數(shù)双藕,可以返回一個(gè)類型的值
ghci> :t Circle
Circle :: Float -> Float -> Float -> Shape
ghci> :t Rectangle
Rectangle :: Float -> Float -> Float -> Float -> Shape
原來構(gòu)造子本身就是函數(shù)!
surface :: Shape -> Float
surface (Circle _ _ r) = pi * r ^ 2
surface (Rectangle x1 y1 x2 y2) = (abs $ x2 - x1) * (abs $ y2 - y1)
取Shape類型的一個(gè)值淑趾,返回Float類型的一個(gè)值,圓我們用_ 模式匹配不理會(huì)前2項(xiàng).
ghci> surface $ Circle 10 20 10
314.15927
ghci> surface $ Rectangle 0 0 100 100
10000.0