是否有可能做的事情等同于拥有一个数据类型的字段,该字段是根据该数据类型的其他字段自动计算得出的。例如:
data Grid = Grid
{ x :: Int
, y :: Int
, c = (x * y) :: Int
}
然后
myGrid = Grid 5 6
是必须这样做还是只能通过Class
完成?
data Grid = Grid
{ x :: Int
, y :: Int
}
class Calculated a where
c :: a -> Int
instance Calculated Grid where
c g = x g * y g
答案 0 :(得分:3)
没有任何其他要求,这只是一个功能。
c :: Grid -> Int
c g = x g * y g
答案 1 :(得分:3)
如果由于某种原因要预计算c
并将其存储在值中,请定义一个智能构造函数。
data Grid = Grid {x :: Int, y :: Int, c :: Int}
mkGrid :: Int -> Int -> Grid
mkGrid x y = Grid x y (x * y)
Haskell中的数据和功能比OO语言中的严格分离。 data
仅定义一个新类型,而不定义对该类型的操作。记录语法仅提供Grid -> x
类型的x
形式的投影;它不会让您定义更复杂的内容。