haskell:自定义数据类型中的计算字段

时间:2019-05-31 14:10:57

标签: haskell

是否有可能做的事情等同于拥有一个数据类型的字段,该字段是根据该数据类型的其他字段自动计算得出的。例如:

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

2 个答案:

答案 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形式的投影;它不会让您定义更复杂的内容。