Haskell記錄並不比其他類型系統「不那麼結構化」。每種類型都是完全指定的,或者「特別模糊」(即用類型類定義)。
同時允許HRec
和HRec2
到f
,你有兩個選擇:
代數類型:
在這裏,你定義HRec
和HRec2
記錄,同時成爲HRec
類型的一部分:
data HRec = HRec { x :: Int, y :: Bool }
| HRec2 { p :: Int, q :: Bool }
foo :: HRec -> Bool
(或者,也許更習慣:) :)
data HRecType = Type1 | Type2
data HRec = HRec { hRecType :: HRecType, x :: Int, y :: Bool }
類型類
在這裏,你定義foo
爲能夠接受任何類型的輸入,只要一個類型類的實例已經爲該類型寫着:
data HRec = HRec { x :: Int, y :: Bool }
data HRec2 = HRec2 { p :: Int, q :: Bool }
class Flexible a where
foo :: a -> Bool
instance Flexible HRec where
foo (HRec a _) = a == 5 -- or whatever
instance Flexible HRec2 where
foo (HRec2 a _) = a == 5
使用類型類可以比常規結構類型更進一步 - 您可以接受嵌入了必要信息的類型,前夕n對於類型不表面上看起來很相似,例如:
data Foo = Foo { a :: String, b :: Float }
data Bar = Bar { c :: String, d :: Integer }
class Thing a where
doAThing :: a -> Bool
instance Thing Foo where
doAThing (Foo x y) = (x == "hi") && (y == 0)
instance Thing Bar where
doAThing (Bar x y) = (x == "hi") && ((fromInteger y) == 0)
我們可以運行fromInteger
(或任意功能)離開我們有得到我們需要的數據!
這似乎更像是一個郵件列表的問題,而不是一個SO一個 - 研發語言進化史和理由不是一個真正的編程問題。但我並沒有真正致力於這個想法。 – millimoose
我瘋狂的猜測:因爲整個記錄點是定義中的字段順序並不重要。如果是這樣,你可以使用一個元組來代替。 (當然,您可能需要一個數據結構,其中的部分定義順序很重要,**和**允許您通過名稱訪問它們以方便起見。無論這是一個好主意還是值得費心添加另一個基礎雖然這樣的數據類型絕對不是爭論。) – millimoose
我不會看到記錄作爲例外。 Haskell的打字一般是非常有名的,而不是結構性的。 – kosmikus