2016-12-30 6 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

Смежные вопросы