2016-12-30 105 views
2

大厦数据我有一个这样的数据类型:喜欢各地的方案中使用与逻辑

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次?

回答

6

这将工作。通过将该值绑定到某个名称上,无论您多久使用它,都要确保仅对其进行评估(至多)一次,然后进行共享。

(有一个例外,虽然:

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

这种明显的常数是多态的,并会在每次使用(这是真的fromInteger (42 :: Integer))被重新计算,但并不适用于你的代码,这是所有。单形)。

+0

好的,谢谢 - 所以我没有写出任何形式的亵渎:)或“不好的做法”的具体情况,对不对? – Randomize

+0

@Randomize不,我没有看到你的代码有问题。 – melpomene

+0

@Randomize否,对于只应计算一次的事物使用顶级绑定是相当习惯的。 – chi