Haskell(使用ghc)是否有任何方式直接使用數據類型的值而不使用模式匹配類似於面向對象的編程語言(例如obj.a或obj-> a)?使用沒有模式匹配的數據類型的值
我尋找的東西是這樣的:
data Obj = Obj {a :: Int, b :: Int}
some :: Obj -> Int
some o = o.a
Haskell(使用ghc)是否有任何方式直接使用數據類型的值而不使用模式匹配類似於面向對象的編程語言(例如obj.a或obj-> a)?使用沒有模式匹配的數據類型的值
我尋找的東西是這樣的:
data Obj = Obj {a :: Int, b :: Int}
some :: Obj -> Int
some o = o.a
是的,你已經一半。通過使用記錄語法,你自動創建功能
a (Obj x _) = x
b (Obj _ x) = x
所以,你可以用a myObject
訪問a
值。
但是,正如你所看到的,它可以歸結爲模式匹配。
你可以得到的最接近的是Haskell的記錄,它看起來像這樣:
data Obj = Obj {a :: Int, b :: Int}
它會自動給你的功能:
a :: Obj -> Int
b :: Obj -> Int
可以稱之爲像普通函數(類型註釋爲清晰起見):
(a (o :: Obj)) :: Int
Learn you a Haskell有一個好關於他們的章節。
RecordWildCards
語言擴展也很有幫助。
{-# LANGUAGE RecordWildCards #-}
data Obj = Obj {a :: Int, b :: Int}
some :: Obj -> Int
some Obj{..} = a + b
「不使用類似於面向對象的編程語言中的模式匹配」 - 好吧,消息分派是模式匹配的一種形式,不是嗎?這在Erlang中最爲明顯,但Smalltalk也是如此。 –