Haskell 用逻辑构建数据
我的数据类型如下:Haskell 用逻辑构建数据,haskell,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 +
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)
在Haskell中创建这样的预定义值可以吗?如果在程序中使用了N次
fbles5
,如果以这种方式编写,它将被构建N次 这会有用的。通过将值绑定到一个名称,您可以确保它只被计算(最多)一次,然后被共享,无论您使用它的频率有多高
(但有一个例外:
foo :: (Num a) => a
foo = 42
这个明显的常数是多态的,每次使用时都会重新计算(它实际上是
fromInteger(42::Integer)
)。但这不适用于你的代码,它都是单态的。)好的,谢谢-所以我没有写任何形式的亵渎:)或“坏习惯”,对吗?@Randomize No,我看你的代码没有问题。@Randomize No,对应该只计算一次的内容使用顶级绑定是相当惯用的。要清楚,这些语句是关于GHC现在是如何工作的(即使在那时它们也不是绝对的)。Haskell报告中没有提到任何表达式的求值频率。
foo :: (Num a) => a
foo = 42