我有这样的数据类型:
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次?
答案 0 :(得分:6)
这会奏效。通过将值绑定到名称,您可以确保它只被评估(最多)一次然后共享,无论您多久使用一次。
(但有一个例外:
foo :: (Num a) => a
foo = 42
这个表观常量是多态的,每次使用时都会重新计算(它真的是fromInteger (42 :: Integer)
)。但这并不适用于你的代码,这些代码都是单态的。)