以下面的代码为例。。我定义了一些具有特定性能的可穿戴鞋。。。(耐克、阿迪达斯、彪马(
data Shoe = Nike | Adidas | Puma deriving Show
class Wearable a where
forFeet :: a -> Bool
forUpperBody :: a -> Bool
comfortLevel :: a -> Int
purchasePrice :: a -> Int
from :: a -> String
instance Wearable Shoe where
forFeet _ = True
forUpperBody _ = False
comfortLevel Nike = 5
comfortLevel Adidas = 3
comfortLevel Puma = 8
purchasePrice Nike = 5
purchasePrice Adidas = 3
purchasePrice Puma = 3
from _ = "The World Store"
在typeclass的实例中,在不同的鞋子上定义purchasePrice和comfortLevel等属性在这里感觉有点笨拙。。在定义某些类型的属性时,这种行为的最佳实践是什么?
在这种情况下,我会说使用记录而不是类:
data Shoe = Nike | Adidas | Puma deriving Show
data Wearable = Wearable
{ forFeet :: Bool
, forUpperBody :: Bool
, comfortLevel :: Int
, purchasePrice :: Int
, from :: String
}
mkShoe :: Int -> Int -> Wearable
mkShoe comfort price = Wearable
{ forFeet = True
, forUpperBody = False
, comfortLevel = comfort
, purchasePrice = price
, from = "The World Store"
}
nike, adidas, puma :: Wearable
nike = mkShoe 5 5
adidas = mkShoe 3 3
puma = mkShoe 8 3
getWearable :: Shoe -> Wearable
getWearable show = case shoe of
Nike -> nike
Adidas -> adidas
Puma -> puma