用逻辑构建数据

时间:2016-12-30 23:20:34

标签: haskell

我有这样的数据类型:

data FooBar =
  FooBar { foo :: Double
         , bar :: Double
         , ter :: Double
         }

-- hypothetical builder with some random logic
mkFooBar :: Double -> Double -> FooBar
mkFooBar a b
  | a < 5     = FooBar a b (a + b)
  | a > 100   = FooBar a b (a * b)
  | otherwise = FooBar (a ^ 2) (b ^ 2) ((a + b) ^2)

和程序周围使用的一些预定义值,如:

fBLess5 = mkFooBar 1 200
fBMore100 = mkFooBar 200 200
fBSquared = mkFooBar 50 200
-- and so on

可以在Haskell中构建预定义的值吗?如果在程序周围使用fBLess5 N次,如果以这种方式编写它将被构建N次?

1 个答案:

答案 0 :(得分:6)

这会奏效。通过将值绑定到名称,您可以确保它只被评估(最多)一次然后共享,无论您多久使用一次。

(但有一个例外:

foo :: (Num a) => a
foo = 42

这个表观常量是多态的,每次使用时都会重新计算(它真的是fromInteger (42 :: Integer))。但这并不适用于你的代码,这些代码都是单态的。)